我有这样一个简单的脚本:

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来显示这些消息?如果是,怎么做?!

谢谢


当前回答

我发现在我的实用程序中添加一个自定义的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')

其他回答

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' });

已经有几个答案,但没有一个提到最好的(和最简单的)方法来做到这一点,这是使用产卵和{stdio: 'inherit'}选项。它似乎产生了最准确的输出,例如在显示来自git克隆的进度信息时。

简单地这样做:

var spawn = require('child_process').spawn;

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

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

我发现在我的实用程序中添加一个自定义的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')

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());
});

受到Nathanael Smith的回答和Eric Freese评论的启发,这个问题可以简单到:

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