2016-12-06 11 views
0

git repoに関する情報を含むファイルを作成するビルドスクリプトの一部を作成しようとしています。 2 +コマンドの結果を文字列としてどのように取得するのですか?bash/nodeを使用してコマンド出力を取得する

var fs = require('fs'); 
var exec = require('child_process').exec; 

var cmd = 'echo $(git rev-parse --abbrev-ref HEAD)|$(git log -1 --format=%cd)|$(git rev-parse HEAD)'; 

exec(cmd, function(error, stdout, stderr) { 
    fs.writeFile("src/test.js", stdout, function(err) { 
     if(err) return console.log(err); 
     console.log(stdout); 
    }); 
}); 

私が知っている問題は、私のcmdです。文字列を得るためにはどうすればいいのか分かりません<branch>|<date>|<commit-hash>

答えて

0

echoに渡す引数は引用符で囲まれていません。

echo my-branch-name|Mon Dec 5 09:23:00 2016 -0600|d1a9da04125fd67edea6062e99d0be960220d2a4 

シェルが正しくパイプ、よく、としてここではパイプ文字を解釈している:あなたのgitサブコマンドが評価された後、コマンドは次のようなルックスを実行しています。つまり、echo my-branch-nameの出力をMonというコマンドにパイプしたいと考えています。あなたはechoに、引数の前後に引用符を追加することによってこの問題を解決することができます:

var cmd = 'echo "$(git rev-parse --abbrev-ref HEAD)|$(git log -1 --format=%cd)|$(git rev-parse HEAD)"'; 

私はローカルでこれを試してみましたが、それがファイルに次のように書いた:

my-branch-name|Mon Dec 5 09:23:00 2016 -0600|d1a9da04125fd67edea6062e99d0be960220d2a4 

編集:これは動作しませんWindowsのbashは、child_process.execがデフォルトでcmd.exeを使用しているためです。 shellオプションではbashでそれを指すように可能であってもよいが、代わりに次のようにコマンドを変更すると、OPのために働いたことがあります。

var cmd = 'bash -c \'echo "$(git rev-parse --abbrev-ref HEAD)|$(git log -1 --format=%cd)|$(git rev-parse HEAD)"\''; 
+0

このコマンドは、自分の端末で直接実行すると機能します。スクリプトに入れて実行すると、 'node write_git_info.js'は動作しません。それは文字通り '$(git rev-parse --abbrev-ref HEAD)| $(git log -1 --format =%cd)| $(git rev-parse HEAD)"をファイルに入れます。何の評価もありません。 @chepnerが言ったように、 – David

+0

を実行すると、最後のコマンドだけが出力されます。私はいくつかの文字列の連結を探しています。 – David

+0

はい、そうです、私は急いで@ chepnerのアプローチを採用しました。私は答えのその部分を取り返しました。私は今、 'node' REPLでそれを試しました。 –

-1

あなたはコマンド置換を必要としません。あるコマンドの出力を直接次のパイプにパイプするだけです。

var cmd = 'git rev-parse --abbrev-ref HEAD | git log -1 --format=%cd | git rev-parse HEAD'; 
関連する問題