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へのパスまたは実際のコンテンツのいずれかになります。両方とも機能しません。
これを達成する方法はありますか?
シェルスクリプトを直接実行可能にするには、以下を行う必要があります。
#!/bin/sh
(または#!/bin/bash
など)で開始します。
chmod +x script
としても実行可能にする必要があります。
そうしたくない場合は、スクリプトへのパスで/bin/sh
を実行する必要があります。
cmd := exec.Command("/bin/sh", mongoToCsvSH)
/bin/sh
を実行し、スクリプト自体を引数として渡す必要があります。