一尘不染

如何检测Node.js脚本是否通过外壳管道运行?

node.js

我的问题与此相似:如何检测我的shell脚本是否正在通过管道运行?。区别在于我正在使用的Shell脚本是用Node.js编写的。

假设我输入:

echo "foo bar" | ./test.js

然后,我怎么能得到的价值"foo bar"test.js

我已经阅读了Unix和Node:管道和流,但这似乎只能提供异步解决方案(除非我误会了)。我正在寻找一个同步解决方案。同样,通过这种技术,检测脚本是否正在通过管道传输似乎不是很简单。

TL; DR我的问题有两个方面:

  1. 例如,如何检测Node.js脚本是否通过外壳管道运行echo "foo bar" | ./test.js
  2. 如果是这样,如何在Node.js中读出管道值?

阅读 246

收藏
2020-07-07

共1个答案

一尘不染

管道用于处理小的输入(例如“ foo bar”),也可以处理巨大的文件。

流API确保您可以开始处理数据,而无需等待巨大的文件完全通过管道传输(这对于速度和内存来说更好)。它的方法是为您提供数据块。

没有用于管道的同步API。如果您确实想在做某件事之前将整个管道输入都掌握在手中,则可以使用

注意:仅使用 节点> =0.10.0,因为该示例使用stream2
API

var data = '';
function withPipe(data) {
   console.log('content was piped');
   console.log(data.trim());
}
function withoutPipe() {
   console.log('no content was piped');
}

var self = process.stdin;
self.on('readable', function() {
    var chunk = this.read();
    if (chunk === null) {
        withoutPipe();
    } else {
       data += chunk;
    }
});
self.on('end', function() {
   withPipe(data);
});

用…测试

echo "foo bar" | node test.js

node test.js
2020-07-07