如何在NodeJS中生成一个新进程并将stderr重定向到stdout?

时间:2016-11-19 20:48:25

标签: node.js bash

我需要在NodeJS中生成一个新进程。它的stderr应该被重定向到它的标准输出(与bash中的2>&1相同)。

proc.js

var child_process = require('child_process');

var opt = {stdio: ['ignore', 'pipe', 'pipe']};
var proc = child_process.spawn('./myscript', [], opt);
proc.stderr.pipe(proc.stdout);
proc.stdout.on('data', function (buf) {
    console.log('stdout', buf.toString());
});
proc.on('error', function (...args) {
    console.log('error', args);
});
proc.on('exit', function (code, signal) {
    console.log('exit', code, signal);
});
proc.on('close', function (code, signal) {
    console.log('close', code, signal);
});

的MyScript

#!/bin/bash

echo 111
echo 222 >&1
echo 333 >&2
echo 444

不幸的是,这不起作用。输出中没有 333

stdout 111
222
444

exit 0 null
close 0 null

1 个答案:

答案 0 :(得分:3)

我认为你的问题是你正在将子(proc)stderr传递给它自己的stdout,而不是你自己的stdout。 proc.stdout是一个源,而不是一个接收器,所以它不能从另一个管道接收输入。

也许你想要的是,而不是:

proc.stderr.pipe(proc.stdout);

这样:

proc.stderr.pipe(process.stdout);

process.stdout是你的父进程stdout,它是一个接收器,因此可以使用proc.stderr作为源。