2014-09-14 31 views
10

Golang'dan bir komut dosyası (.sh) dosyasını yürütmenin bir yolunu bulmaya çalışıyorum. Komutları yürütmek için birkaç kolay yol buldum (örn. Os/exec), ama yapmak istediğim şey tüm sh dosyasını çalıştırmaktır (dosya değişkenleri vb. Ayarlar).Golang'dan bir Bash Komut Dosyası Yürütme

Bunun için standart os/exec yöntemini kullanmak kolay görünmüyor: "./script.sh" dosyasını girmeye çalışmak ve komut dosyasının içeriğini bir dizeye yüklemek exec işlevi için argüman olarak çalışmıyor . Git programından

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; 

:

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

mongoToCsvSH sh yolu veya ikisinden biri olabilir

örneğin

, bu şimdiye git dan yürütmek istediğiniz bir sh dosyasıdır gerçek içerik - her ikisi de çalışmıyor.

Bunu nasıl başarırsınız?

cevap

19

Mecbur:

  1. #!/bin/sh (veya #!/bin/bash, vs) ile başlayın

    .

  2. chmod +x script. bunu yapmak istemiyorsanız

, o zaman komut dosyası yolu ile /bin/sh yürütmek zorunda kalacaktır.

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

Teşekkürler. Bu çalışıyor gibi görünüyor. Ancak şimdi farklı bir sorunum var - komut dosyası çalıştırmak için yaklaşık 1 dakika sürüyor olsa da, program çalışmayı bitirmesini beklemiyor. ve böylece ihracat, fiilen henüz yazılmadan devam ediyor .. herhangi bir fikir? – orcaman

+0

@orcaman nasıl çalışıyorsunuz? exec.Command ("/ bin/sh", mongoToCsvSH) .Output() '? – OneOfOne

+0

evet. Bir şey, sonraki satırlara devam etmeden önce bu dosyayı dosyaya vermek için beklemek zorundayım. – orcaman

1

/bin/sh dosyasını çalıştırmanız ve komut dosyasının kendisini argüman olarak iletmeniz gerekir. Kabuk komut doğrudan çalıştırılabilir olması için

İlgili konular