Javascript 如何使用Unix管道(在命令行上)将Node.js脚本连接在一起?

Javascript 如何使用Unix管道(在命令行上)将Node.js脚本连接在一起?,javascript,node.js,unix,pipe,command-line-interface,Javascript,Node.js,Unix,Pipe,Command Line Interface,我看到了如何使用Node.js streams将内容管道连接在一起,但是如果其中一些脚本可以是异步的,那么如何使用Unix将多个脚本管道连接在一起呢 $ ./a.js | ./b.js 例如: a.js(chmod 0755) b.js(chmod 0755) 这是输出: $ ./a.js | ./b.js [ 'node', '/Users/viatropos/tests/b.js' ] events.js:72 throw er; // Unhandled 'error'

我看到了如何使用Node.js streams将内容管道连接在一起,但是如果其中一些脚本可以是异步的,那么如何使用Unix
将多个脚本管道连接在一起呢

$ ./a.js | ./b.js
例如:

a.js(chmod 0755)

b.js(chmod 0755)

这是输出:

$ ./a.js | ./b.js
[ 'node', '/Users/viatropos/tests/b.js' ]

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: write EPIPE
    at errnoException (net.js:883:11)
    at Object.afterWrite (net.js:700:19)

乍一看似乎有很多地方出了问题,所以不确定从哪里开始。有没有办法让它发挥作用?最终目标是能够从
/a.js
获取
控制台.log
输出,并在
/b.js
中使用它。原因是,大多数情况下,这些脚本一次运行一个,但有时能够将它们连接在一起会很好,因此理想情况下,系统应该能够处理这两种情况。

问题是,您的
b.js
立即结束并在中关闭其标准,这会导致
a.js
中出现错误,因为它的标准输出被关闭了,而你没有处理这种可能性。您有两个选项:在
a.js
中处理stdout关闭,或在
b.js
中接受输入

修复
a.js

process.on("SIGPIPE", process.exit);
#!/usr/bin/env node

var stdin = process.openStdin();

var data = "";

stdin.on('data', function(chunk) {
  data += chunk;
});

stdin.on('end', function() {
  console.log("DATA:\n" + data + "\nEND DATA");
});
如果您添加该行,当没有人再读取其输出时,它就会放弃。根据您的程序正在执行的操作,在SIGPIPE上可能有更好的操作,但关键是停止
console.log
ing

修复
b.js

process.on("SIGPIPE", process.exit);
#!/usr/bin/env node

var stdin = process.openStdin();

var data = "";

stdin.on('data', function(chunk) {
  data += chunk;
});

stdin.on('end', function() {
  console.log("DATA:\n" + data + "\nEND DATA");
});
当然,你不必对这些数据做任何事情。他们的关键是要有一些东西来保持流程的运行;如果您要通过管道连接到它,
stdin.on('data',fx)
似乎是一件有用的事情


记住,这两种方法中的任何一种都可以防止这种错误。如果您计划在程序之间进行管道连接,我希望第二种方法最有用。

这是最有用的。是否有可能以某种方式检查程序是否在“管道”模式下使用(或者我们应该称之为什么)?例如,如果CLI程序a)检查它是否是分叉的(
if(process.send){}
),b)如果不是,检查它是否是在“管道模式”(如上面的示例)下调用的,或者c)如果不是,则正常输出(假设它是独立调用的)。这样CLI程序就可以适应用例。编辑:已找到我的答案()