我有这样一个简单的脚本:
var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee', function(error, stdout, stderr) {
console.log(stdout);
});
我只是简单地执行一个命令来编译一个咖啡脚本文件。但是stdout永远不会显示在控制台中,因为命令永远不会结束(因为coffee的-w选项)。
如果我直接从控制台执行命令,我会得到这样的消息:
18:05:59 - compiled my_file.coffee
我的问题是:是否可以用node.js的exec来显示这些消息?如果是,怎么做?!
谢谢
在回顾了所有其他答案后,我得出了以下结论:
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);
});
}
有时数据是多行,因此oldSchoolMakeBuild标头将为多行出现一次。但这并没有困扰到我去改变它。
在回顾了所有其他答案后,我得出了以下结论:
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);
});
}
有时数据是多行,因此oldSchoolMakeBuild标头将为多行出现一次。但这并没有困扰到我去改变它。
child_process。Spawn返回一个带有标准输出和标准错误流的对象。
您可以点击标准输出流以读取子进程发送回Node的数据。Stdout是一个流,它有"data", "end"和其他流的事件。当你想让子进程向Node返回大量数据时,spawn最适合使用——图像处理,读取二进制数据等。
所以你可以使用child_process来解决你的问题。衍生如下所示。
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还将返回一个ChildProcess对象,它是一个EventEmitter对象。
var exec = require('child_process').exec;
var coffeeProcess = exec('coffee -cw my_file.coffee');
coffeeProcess.stdout.on('data', function(data) {
console.log(data);
});
或将子进程的标准输出输出到主标准输出。
coffeeProcess.stdout.pipe(process.stdout);
或者使用衍生继承stdio
spawn('coffee -cw my_file.coffee', { stdio: 'inherit' });