我有这个简单的脚本:
var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee', function(error, stdout, stderr) {
console.log(stdout);
});
在这里我只是执行命令编译咖啡脚本文件。 但是,标准输出永远不会显示在控制台,因为该命令永远不会结束(因为咖啡的-w选项)。 如果我直接从控制台执行命令我得到的消息是这样的:
18:05:59 - compiled my_file.coffee
我的问题是:是否有可能以显示与node.js的EXEC这些消息? 如果是的话怎么样? !
谢谢
Answer 1:
不要使用exec
。 使用spawn
这是一个EventEmmiter
对象。 然后,你可以听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
缓冲器的输出和通常返回它当命令已完成执行。
Answer 2:
exec
也将返回一个子进程对象,它是一个EventEmitter。
var exec = require('child_process').exec;
var coffeeProcess = exec('coffee -cw my_file.coffee');
coffeeProcess.stdout.on('data', function(data) {
console.log(data);
});
OR pipe
子进程的标准输出到主标准输出。
coffeeProcess.stdout.pipe(process.stdout);
或使用产卵继承STDIO
spawn('coffee -cw my_file.coffee', { stdio: 'inherit' });
Answer 3:
目前已经有好几个答案但他们没有提到要做到这一点,这是使用最好的(和最简单的)的方式spawn
和{ stdio: 'inherit' }
选项 。 这似乎显示从进度信息时产生最准确的输出,例如git clone
。
只要做到这一点:
var spawn = require('child_process').spawn;
spawn('coffee', ['-cw', 'my_file.coffee'], { stdio: 'inherit' });
感谢@MorganTouvereyQuilling在指出这此评论 。
Answer 4:
我只是想补充的是一个小问题,与从衍生进程输出缓冲器串console.log()
是,它增加了换行符,它可以传播你的催生过程输出过其他行。 如果您输出stdout
或stderr
与process.stdout.write()
而不是console.log()
然后你就会从衍生进程“是”得到的控制台输出。
我看到这里的解决方案: Node.js的:在没有尾随换行符控制台打印?
希望可以帮助别人使用上面的解决方案(这是现场输出一个伟大的,哪怕是从文档)。
Answer 5:
由史密斯拿但业的回答和埃里克·弗里兹的评论的启发,它可能是简单的:
var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee').stdout.pipe(process.stdout);
Answer 6:
审查所有其他的答案后,我结束了这一点:
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
头将多行中出现一次。 但是,这并没有打扰我,足以改变它。
Answer 7:
我发现它有助于一个自定义脚本的exec添加到我的实用程序,做到这一点。
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')
Answer 8:
child_process.spawn返回与输出和错误流的对象。 您可以点击标准输出流中读取子进程发送回节点的数据。 标准输出作为一个流具有“数据”,“结束”,和其他事件流有。 产卵,最好使用当你想子进程返回大量的数据节点来 - 图像处理,读取二进制数据等。
所以你可以使用child_process.spawn如下用于解决您的问题。
var spawn = require('child_process').spawn,
ls = spawn('coffee -cw my_file.coffee');
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('code ' + code.toString());
});
文章来源: Exec : display stdout “live”