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?
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
@orcaman Wie läuft es? 'exec.Command ("/bin/sh ", mongoToCsvSH) .Output()'? – OneOfOne
ja. Sache ist, ich muss auf diesen sh warten, um die Datei zu exportieren, bevor ich mit den nächsten Zeilen fortfahre. – orcaman