我有这样一个简单的脚本:
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来显示这些消息?如果是,怎么做?!
谢谢
下面是一个用typescript编写的async helper函数,它似乎对我有用。我猜这对长生命周期的过程不适用,但对某些人来说仍然很方便。
import * as child_process from "child_process";
private async spawn(command: string, args: string[]): Promise<{code: number | null, result: string}> {
return new Promise((resolve, reject) => {
const spawn = child_process.spawn(command, args)
let result: string
spawn.stdout.on('data', (data: any) => {
if (result) {
reject(Error('Helper function does not work for long lived proccess'))
}
result = data.toString()
})
spawn.stderr.on('data', (error: any) => {
reject(Error(error.toString()))
})
spawn.on('exit', code => {
resolve({code, result})
})
})
}
我发现在我的实用程序中添加一个自定义的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。使用spawn,这是一个eventemitter对象。然后你可以在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缓冲输出,通常在命令执行完成时返回。