web-dev-qa-db-ja.com

GolangからBashスクリプトを実行する

Golangからスクリプト(.sh)ファイルを実行する方法を見つけようとしています。コマンド(os/execなど)を実行する簡単な方法をいくつか見つけましたが、私がしたいのはshファイル全体(ファイルが変数を設定するなど)を実行することです。

これに標準のos/execメソッドを使用するのは簡単ではないようです。「./ script.sh」を入力しようとしても、スクリプトの内容を文字列にロードしても、exec関数の引数として機能しません。

たとえば、これは、Goから実行するshファイルです。

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;

goプログラムから:

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

ここで、mongoToCsvSHはshへのパスまたは実際のコンテンツのいずれかになります。両方とも機能しません。

これを達成する方法はありますか?

21
orcaman

シェルスクリプトを直接実行可能にするには、以下を行う必要があります。

  1. #!/bin/sh(または#!/bin/bashなど)で開始します。

  2. chmod +x scriptとしても実行可能にする必要があります。

そうしたくない場合は、スクリプトへのパスで/bin/shを実行する必要があります。

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

/bin/shを実行し、スクリプト自体を引数として渡す必要があります。

3
Evan