2016-12-06 96 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的參數未被引用。您git子進行評估後,命令你執行這個樣子的:

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

外殼採用正確這裏解釋管道字符,那麼,管道。換句話說,它認爲你想將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 

編輯:這不會工作顯然是因爲child_process.exec默認使用cmd.exe。它可能會在與shell選項慶典指向它,而是更改命令爲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)「。沒有eval正在發生。 – David

+0

按照@chepner的說法,只輸出最後一條命令。我正在尋找一些字符串連接。 – David

+0

是的,你說得對,我很快採納@ chepner的方法。我回復了我的答案的一部分。我剛剛在'node' REPL中嘗試過,它的工作原理與上面所述完全相同。 –

-1

你不需要命令替換。只需將一個命令的輸出直接傳送到下一個。

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