web-dev-qa-db-fra.com

Exécution d'un script Bash depuis Golang

J'essaie de trouver un moyen d'exécuter un fichier script (.sh) à partir de Golang. J'ai trouvé quelques façons simples d'exécuter des commandes (par exemple os/exec), mais ce que je cherche à faire est d'exécuter un fichier sh entier (le fichier définit des variables, etc.).

L'utilisation de la méthode standard os/exec pour cela ne semble pas simple: à la fois essayer d'entrer "./script.sh" et charger le contenu du script dans une chaîne ne fonctionnent pas comme arguments pour la fonction exec.

par exemple, c'est un fichier sh que je veux exécuter depuis 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;

du programme Go:

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

où mongoToCsvSH peut être le chemin vers le sh ou le contenu réel - les deux ne fonctionnent pas.

Des idées pour y parvenir?

21
orcaman

Pour que votre script Shell soit directement exécutable, vous devez:

  1. Commencez avec #!/bin/sh (ou #!/bin/bash, etc).

  2. Vous devez le rendre exécutable, alias chmod +x script.

Si vous ne voulez pas faire cela, vous devrez exécuter /bin/sh avec le chemin d'accès au script.

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

Vous devez exécuter /bin/sh et passez le script lui-même comme argument.

3
Evan