Выполнение Bash Script из Golang

Я пытаюсь выяснить способ выполнения файла script (.sh) из Golang. Я нашел несколько простых способов выполнения команд (например, os/exec), но то, что я хочу сделать, - это выполнить весь файл sh (файл устанавливает переменные и т.д.).

Использование стандартного метода os/exec для этого не кажется простым: оба пытающиеся ввести "./ script.sh" и загружая содержимое script в строку, не работают как аргументы для функция exec.

например, это sh файл, который я хочу выполнить из Go:

OIFS=$IFS;
IFS=",";

# fill in your details here
dbname=testDB
host=localhost:27017
collection=testCollection
exportTo=../csv/

# get comma separated list of keys. do this by peeking into the first document in the collection and get his set of keys
keys=`mongo "$host/$dbname" --eval "rs.slaveOk();var keys = []; for(var key in db.$collection.find().sort({_id: -1}).limit(1)[0]) { keys.push(key); }; keys;" --quiet`;
# now use mongoexport with the set of keys to export the collection to csv
mongoexport --host $host -d $dbname -c $collection --fields "$keys" --csv --out $exportTo$dbname.$collection.csv;

IFS=$OIFS;

из программы Go:

out, err := exec.Command(mongoToCsvSH).Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("output is %s\n", out)

где mongoToCsvSH может быть либо путём к sh, либо фактическим содержимым - оба не работают.

Любые идеи, как достичь этого?

Ответ 1

Чтобы ваша оболочка script была напрямую запущена, вы должны:

  • Запустите его с помощью #!/bin/sh (или #!/bin/bash и т.д.).

  • Вы должны сделать его исполняемым, aka chmod +x script.

Если вы не хотите этого делать, вам нужно будет выполнить /bin/sh с помощью пути к script.

cmd := exec.Command("/bin/sh", mongoToCsvSH)

Ответ 2

Вам нужно выполнить /bin/sh и передать сам script в качестве аргумента.