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

vba*_*osh 5 bash node.js

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

程序.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);
});
Run Code Online (Sandbox Code Playgroud)

我的脚本

#!/bin/bash

echo 111
echo 222 >&1
echo 333 >&2
echo 444
Run Code Online (Sandbox Code Playgroud)

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

stdout 111
222
444

exit 0 null
close 0 null
Run Code Online (Sandbox Code Playgroud)

Jim*_* B. 5

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

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

proc.stderr.pipe(proc.stdout);
Run Code Online (Sandbox Code Playgroud)

这个:

proc.stderr.pipe(process.stdout);
Run Code Online (Sandbox Code Playgroud)

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

  • 我显然有办法用词。我打算使用 gazintah 和 gazoutah,但最终选择了 sink 和 source。:-) (3认同)
  • 或者在节点方面,proc.stdout 是一个 ReadableStream,而 process.stdout 是一个 WriteableStream (2认同)