使用bash/node检索命令输出

问题描述:

我试图创建一个构建脚本的一部分,该脚本创建一个包含有关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>

问题是您传递给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中尝试过,它的工作原理与上面所述完全相同。 –

你不需要命令替换。只需将一个命令的输出直接传送到下一个。

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