高管:显示标准输出“活”高管:显示标准输出“活”(Exec : display stdout “li

2019-05-13 14:38发布

我有这个简单的脚本:

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()是,它增加了换行符,它可以传播你的催生过程输出过其他行。 如果您输出stdoutstderrprocess.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”