节点的child_process中奇怪的管道行为?

时间:2017-10-20 15:28:26

标签: node.js linux jq child-process

我有一个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一样。

1 个答案:

答案 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";