如何使用Unix管理Node.js脚本管道(在命令行上)?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Unix管理Node.js脚本管道(在命令行上)?相关的知识,希望对你有一定的参考价值。
我看到如何使用Node.js流将各种东西连接在一起,但是如何使用Unix |
将多个脚本连接在一起,因为其中一些脚本可以是异步的?
$ ./a.js | ./b.js
例:
a.js(chmod 0755)
#!/usr/bin/env node
setTimeout(function(){
console.log(JSON.stringify({ foo: 'bar' }));
}, 10);
b.js(chmod 0755)
#!/usr/bin/env node
console.log(process.argv);
这是输出:
$ ./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)
乍一看似乎有很多问题,所以不确定从哪里开始。有没有办法让这个工作?最终目标是能够从console.log
获取./a.js
输出并在./b.js
中使用它。原因是,大多数情况下这些脚本将一次运行一个,但有时将它们组合在一起会很好,所以理想情况下系统应该能够处理这两种情况。
答案
问题是你的b.js
立即结束并关闭其标准,导致a.js
出错,因为它的标准输出被关闭而你没有处理这种可能性。您有两个选择:在a.js
中处理stdout结束或在b.js
中接受输入。
修复a.js
:
process.on("SIGPIPE", process.exit);
如果你添加那一行,那么当没有人再读取它的输出时它就会放弃。根据你的程序正在做什么,在SIGPIPE上可能有更好的事情要处理,但关键是要停止console.log
ing。
修复b.js
:
#!/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)
似乎是一件有用的事情。
请记住,其中任何一个都可以防止该错误。如果你计划在程序之间进行管道,我希望第二个最有用。
以上是关于如何使用Unix管理Node.js脚本管道(在命令行上)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Perl 中使用带有管道的 Unix/AIX find 命令?