Exec:显示stdout“live”?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

我有这个简单的脚本:

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。使用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 缓冲输出并通常在命令执行完成时返回。

用户回答回答于

exec 也会返回一个EventEmitter的ChildProcess对象。

var exec = require('child_process').exec;
var coffeeProcess = exec('coffee -cw my_file.coffee');

coffeeProcess.stdout.on('data', function(data) {
    console.log(data); 
});

或者pipe将子进程的stdout添加到主stdout。

coffeeProcess.stdout.pipe(process.stdout);

扫码关注云+社区