2014-09-14 10 views
10

Ich versuche, eine Möglichkeit zu finden, eine Skriptdatei (.sh) von Golang auszuführen. Ich habe ein paar einfache Wege gefunden, Befehle auszuführen (z. B. os/exec), aber was ich zu tun versuche, ist die Ausführung einer ganzen sh-Datei (die Datei setzt Variablen usw.).Ausführen eines Bash-Skripts von Golang

Die Verwendung der Standard os/exec-Methode scheint nicht einfach zu sein: beide versuchen, "./script.sh" einzugeben und den Inhalt des Skripts in einen String zu laden, funktionieren nicht als Argumente für die exec-Funktion .

zum Beispiel, ist dies eine sh-Datei, die ich von Go ausführen möge:

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; 

aus dem Go-Programm:

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

wo mongoToCsvSH kann entweder der Pfad zur sh oder der eigentliche Inhalt - beides funktioniert nicht.

Irgendwelche Ideen wie man das erreicht?

Antwort

19

Für Ihre Shell-Skript direkt runnable sein zu können, müssen Sie:

  1. es Beginnen Sie mit #!/bin/sh (oder #!/bin/bash, etc).

  2. Sie müssen es ausführbar machen, alias chmod +x script.

Wenn Sie das nicht tun wollen, dann werden Sie /bin/sh mit dem Pfad zum Skript ausführen müssen.

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

danke. das scheint zu funktionieren. Aber jetzt habe ich ein anderes Problem - obwohl das Skript ungefähr 1 Minute braucht, um zu laufen, wartet das Programm nicht darauf, dass es beendet wird. und so wird die Ausführung fortgesetzt, ohne dass der Export tatsächlich geschrieben wird ... irgendwelche Ideen? – orcaman

+0

@orcaman Wie läuft es? 'exec.Command ("/bin/sh ", mongoToCsvSH) .Output()'? – OneOfOne

+0

ja. Sache ist, ich muss auf diesen sh warten, um die Datei zu exportieren, bevor ich mit den nächsten Zeilen fortfahre. – orcaman

1

Sie müssen /bin/sh ausführen und das Skript selbst als Argument übergeben.