使用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)"\'';
答
你不需要命令替换。只需将一个命令的输出直接传送到下一个。
var cmd = 'git rev-parse --abbrev-ref HEAD | git log -1 --format=%cd | git rev-parse HEAD';
该命令如果我直接在我的终端中运行它的作品。如果我把它放在我的脚本中并运行它,'node write_git_info.js',它就不起作用。它直接在文件中放入''($ git rev-parse --abbrev-ref HEAD)| $(git log -1 --format =%cd)| $(git rev-parse HEAD)“。没有eval正在发生。 – David
按照@chepner的说法,只输出最后一条命令。我正在寻找一些字符串连接。 – David
是的,你说得对,我很快采纳@ chepner的方法。我回复了我的答案的一部分。我刚刚在'node' REPL中尝试过,它的工作原理与上面所述完全相同。 –