Exec:显示stdout“live”

我有这个简单的脚本:

var exec = require('child_process').exec; exec('coffee -cw my_file.coffee', function(error, stdout, stderr) { console.log(stdout); }); 

在那里我只是执行一个命令来编译一个咖啡脚本文件。 但stdout永远不会显示在控制台中,因为命令永远不会结束(因为咖啡的-w选项)。 如果我直接从控制台执行命令,我会得到像这样的消息:

 18:05:59 - compiled my_file.coffee 

我的问题是:是否有可能用node.js exec显示这些消息? 如果是的话如何? !

谢谢

不要使用exec 。 使用一个EventEmmiter对象的spawn 。 然后你可以听stdout / stderr事件( spawn.stdout.on('data',callback..) )。

从NodeJS文档:

 var spawn = require('child_process').spawn, ls = spawn('ls', ['-lh', '/usr']); ls.stdout.on('data', function (data) { console.log('stdout: ' + data.toString()); }); ls.stderr.on('data', function (data) { console.log('stderr: ' + data.toString()); }); ls.on('exit', function (code) { console.log('child process exited with code ' + code.toString()); }); 

exec缓冲输出,并通常在命令执行完成后返回。

exec还将返回一个EventPromitter的ChildProcess对象。

 var exec = require('child_process').exec; var coffeeProcess = exec('coffee -cw my_file.coffee'); coffeeProcess.stdout.on('data', function(data) { console.log(data); }); 

或者将subprocess的stdout传递给主stdout。

 coffeeProcess.stdout.pipe(process.stdout); 

我只想补充一点,用console.log()从产生的进程中输出缓冲区string的一个小问题是,它添加了换行符,它可以将生成的进程输出扩展到另外的行。 如果使用process.stdout.write()而不是console.log() process.stdout.write()来输出stdoutstderr ,那么您将从“原样”得到衍生进程的控制台输出。

我在这里看到了这个解决scheme: Node.js:打印到没有尾随换行符的控制台?

希望能帮助使用上述解决scheme的人(即使是来自文档的实时输出,这也是一个很棒的解决scheme)。

受到Nathanael Smith的回答和Eric Freese的评论的启发,它可能如此简单:

 var exec = require('child_process').exec; exec('coffee -cw my_file.coffee').stdout.pipe(process.stdout); 

已经有几个答案,但是他们没有提到使用spawn{ stdio: 'inherit' }选项的最好的(也是最简单的)方法。 它似乎产生最准确的输出,例如,当显示来自git clone的进度信息。

只需做到这一点:

 var spawn = require('child_process').spawn; spawn('coffee', ['-cw', 'my_file.coffee'], { stdio: 'inherit' }); 

感谢@MorganTouvereyQuilling在此评论中指出了这一点 。

在回顾了所有其他的答案后,我结束了这个:

 function oldSchoolMakeBuild(cb) { var makeProcess = exec('make -C ./oldSchoolMakeBuild', function (error, stdout, stderr) { stderr && console.error(stderr); cb(error); }); makeProcess.stdout.on('data', function(data) { process.stdout.write('oldSchoolMakeBuild: '+ data); }); } 

有时候data会是多行的,所以oldSchoolMakeBuild头文件会出现多行。 但是这并没有让我感到困扰,所以没有改变。

我发现将自定义执行脚本添加到我的实用程序是很有帮助的。

utilities.js

 const { exec } = require('child_process') module.exports.exec = (command) => { const process = exec(command) process.stdout.on('data', (data) => { console.log('stdout: ' + data.toString()) }) process.stderr.on('data', (data) => { console.log('stderr: ' + data.toString()) }) process.on('exit', (code) => { console.log('child process exited with code ' + code.toString()) }) } 

app.js

 const { exec } = require('./utilities.js) exec('coffee -cw my_file.coffee')