【发布时间】:2020-09-10 16:13:46
【问题描述】:
考虑下面的一个简单示例,在该示例中,我在发送一个长时间运行的命令时打印响应。
const { spawn } = require('child_process');
const ping = spawn('ping', ['www.google.com']);
ping.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ping.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
ping.on('close', (code) => {
if (code !== 0) {
console.log(`ping process exited with code ${code}`);
}
});
这工作正常。但是,当我尝试将此结果通过管道传输到 grep 时,它会停止工作。
请参阅下面的示例
const { spawn } = require('child_process');
const ping = spawn('ping', ['www.google.com']);
const grep = spawn('grep', ['bytes'])
ping.stdout.on('data', (data) => {
grep.stdin.write(data)
});
ping.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
ping.on('close', (code) => {
if (code !== 0) {
console.log(`ping process exited with code ${code}`);
}
grep.stdin.end();
});
grep.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
grep.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
grep.on('close', (code) => {
console.log(`grep process exited with code ${code}`);
});
上面的代码没有给我任何结果。
看起来它正在等待第一个命令结束,然后再将结果传递给下一个。
我通过试验ls 命令观察到这一点。
管道的全部意义不在于不等待吗?还是我在这里遗漏了什么?
我尝试过的一些变化没有成功:
ping.stdout.pipe(grep.stdin);而不是grep.stdin.write(data),虽然我不相信两者之间有太大区别。const ping = spawn('sh', ['-c', 'ping www.google.com | grep bytes']);我已经尝试过使用非长时间运行的命令,它工作正常,包括管道和所有东西。
【问题讨论】:
标签: node.js bash shell grep pipe