我正在使用Node的child_process.spawn()运行外壳命令,并带有以下代码:
const process = require('child_process').spawn('whoami');
// this works...
process.stdout.on('data', function(buf) {
console.log('HERE IS SOME STDOUT CONTENT "%s"', String(buf));
});
// this never works...
process.stderr.on('data', function(buf) {
console.log('HERE IS SOME STDERR CONTENT "%s"', String(buf));
});
// this works, but doesn't let me stream STDERR content...
process.on('error', (err) => {
console.log('there was an error: ' + err);
});
运行上述有效命令whoami
,让我读取传递给process.stdout.on
的函数中的STDOUT数据。
如果我将命令更改为无效的东西(会产生一些STDERR内容),例如...
const process = require('child_process').spawn('whoami BADARGUMENTTOBREAKTHINGS');
... whoami
命令向STDERR输出错误消息(在普通shell中),但是在Node中,process.stderr.on
中的函数从未执行。我从没看到HERE IS SOME STDERR CONTENT
消息。
我还尝试了其他一些无效的shell命令,例如cd folderthatdoesntexist
和ls filenamethatdoesntexist
,它们都应该产生STDERR内容。
答案 0 :(得分:0)
输入问题后,我发现这很简单,因为您无法在.spawn()的第一个参数中使用空格...您必须将其余命令作为第二个参数带有数组,即
const process = require('child_process').spawn('whoami', ['BADARGUMENTTOBREAKTHINGS']);
这是意外的,因为.exec()和.spawnSync()都在第一个参数中使用空格。
希望这可以帮助将来遇到相同问题的其他人。