我有一个shell命令在终端中正常工作但由节点child_process
错误执行。
这是终端中使用的命令(file.json是json文件):
cat /tmp/file.json | jq
这是从child_process
运行相同的命令:
var cp = require("child_process");
var command = "cat /tmp/gen_json | jq";
cp.exec(command, function(err, stdout, stderr) {
stderr ? console.log(stderr) : console.log(stdout);
});
产生:
jq - commandline JSON processor [version 1.5-1-a5b5cbe]
Usage: jq [options] <jq filter> [file...]
jq is a tool for processing JSON inputs, applying the
given filter to its JSON text inputs and producing the
...
这是仅运行jq
时显示的默认消息。就好像我刚刚在没有前面的管道的情况下运行jq
一样。
答案 0 :(得分:1)
如果省略过滤器,则捕获位于jq
的{{3}}。
即,当输出转到终端(TTY)时,可以省略过滤器,默认为.
(漂亮打印)。这就是为什么在终端你可以写:
cat file | jq # or: jq < file
而不是:
cat file | jq . # or: jq . file
从node
调用时,stdin
和 stdout
重定向,jq
需要过滤器论点。这就是你必须明确指定它的原因:
var command = "cat /tmp/gen_json | jq .";
或者,甚至更好(以避免猫科动物滥用):
var command = "jq . /tmp/gen_json";