2014-09-14 21 views
10

Próbuję znaleźć sposób na wykonanie pliku skryptu (.sh) z Golang. Znalazłem kilka łatwych sposobów wykonywania poleceń (na przykład os/exec), ale chciałbym wykonać cały plik sh (plik ustawia zmienne itp.).Wykonywanie skryptu Bash z Golang

Korzystanie ze standardowej metody os/exec nie wydaje się proste: zarówno próba wprowadzenia "./script.sh" i załadowanie zawartości skryptu do ciągu nie działa jako argumenty dla funkcji exec .

na przykład jest to plik sh, że chcę wykonać z ruchu:

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; 

z programu Go:

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

gdzie mongoToCsvSH może być ścieżką do sh lub rzeczywista treść - obie nie działają.

Jakieś pomysły, jak to osiągnąć?

Odpowiedz

19

Dla skrypt powłoki, aby być bezpośrednio runnable trzeba:

  1. Uruchom go z #!/bin/sh (lub #!/bin/bash, etc).

  2. Musisz zrobić to, co można wykonać, czyli chmod +x script.

Jeśli nie chcesz tego zrobić, a następnie trzeba będzie wykonać /bin/sh ze ścieżką do skryptu.

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

dzięki. to wydaje się działać. jednak teraz mam inny problem - chociaż uruchomienie skryptu trwa około 1 minuty, program nie czeka na zakończenie działania skryptu. i tak wykonanie jest kontynuowane bez pisemnego eksportu eksportu .. Jakieś pomysły? – orcaman

+0

@orcaman jak się masz? 'exec.Command ("/bin/sh ", mongoToCsvSH) .Output()'? – OneOfOne

+0

tak. Rzecz w tym, że muszę czekać na wyeksportowanie pliku, zanim przejdę do następnych linii. – orcaman

1

Należy wykonać /bin/sh i przekazać skrypt jako sam argument.