const p = spawn('ls', ['/'])
console.log('$mark$')
p.stdout.pipe(process.stdout)
上面的代码准确地打印了根目录的文件列表,它是:
$mark$
bin
boot
data
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
solr.log
srv
sys
tmp
usr
var
然而,如果我等待片刻,例如1秒,它将不打印任何内容。代码如下:
const p = spawn('ls')
setTimeout(() => {
console.log('$mark$')
p.stdout.pipe(process.stdout)
}, 1000)
只打印:
$mark$
我想知道为什么第二个代码不打印ls
命令的任何内容。
环境:
- Linux:openSUSE Leap 42.3
- 节点:v8.11.1
在第二个代码示例中,当您尝试处理输出并通过管道传输时,ls
的输出已经完成了很长时间。Node.js通常不会为您缓冲未使用的管道。你必须在输出开始前用管道传输它,否则你会丢失数据,或者你必须.pause()
它