How to detect if a Node.js script is running through a shell pipe?
bash, node.js, pipe
Solution
Pipes are made to handle small inputs like "foo bar" but also huge files.
The stream API makes sure that you can start handling data without waiting for the huge file to be totally piped through (this is better for speed & memory). The way it does this is by giving you chunks of data.
There is no synchronous API for pipes. If you really want to have the whole piped input in your hands before doing something, you can use
note: use only node >= 0.10.0 because the example uses the 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);
});
test with
echo "foo bar" | node test.js
and
node test.js
Problem
My question is similar to this one: How to detect if my shell script is running through a pipe?. The difference is that the shell script I’m working on is written in Node.js. Let’s say I enter: ``` echo "foo bar" | ./test.js ``` Then how can I get the value `"foo bar"` in `test.js`? I’ve read Unix and Node: Pipes and Streams but that only seems to offer an asynchronous solution (unless I’m mistaken). I’m looking for a synchronous solution. Also, with this technique, it doesn’t seem very straightforward to detect if the script is being piped or not. TL;DR My question is two-fold: - How to detect if a Node.js script is running through a shell pipe, e.g. `echo "foo bar" | ./test.js`? - If so, how to read out the piped value in Node.js?