在Node.js中保留'child_process.spawnSync'子进程的'stdout'和'stderr'输出顺序

在Node.js中保留'child_process.spawnSync'子进程的'stdout'和'stderr'输出顺序,node.js,pipe,stdout,child-process,Node.js,Pipe,Stdout,Child Process,(bashbash命令只是一个示例。该命令可以是ls或wget或git,这无关紧要。) 当然,我可以使用x.stdout访问子流程的stdout,使用x.stderr访问stderr,因此我将获得 const spawnSync = require('child_process').spawnSync; let x = spawnSync('bash', ['-c', 'echo "1stdout" ; echo "2stderr" >&2 ; echo "3stdout"']);

(bash
bash
命令只是一个示例。该命令可以是
ls
wget
git
,这无关紧要。)

当然,我可以使用
x.stdout
访问子流程的
stdout
,使用
x.stderr
访问
stderr
,因此我将获得

const spawnSync = require('child_process').spawnSync;
let x = spawnSync('bash', ['-c', 'echo "1stdout" ; echo "2stderr" >&2 ; echo "3stdout"']);

分别。然而,我想要的是一个包含

2stderr

我有一种感觉,其中有一些东西可能会有所帮助,但我无法找到它。

如果您同意将交织输出写入文件:

1stdout
2stderr
3stdout

如果您希望它是一个字符串,那么最简单的方法就是读取文件。我认为另一种方法是创建一个双工流并在
{stdio:[null,streamObj,streamObj]}
中传递stream对象。这将需要处理流事件并动态构建字符串,如果使用
spawnSync()

则可能不需要这样做,您可以将stdout和stderr都通过管道传输到一个流,然后再通过管道传输到变量,但我怀疑,获得一个无bug的实现将是非常棘手的,因为像heroku这样的大公司通常会在订单量很大的情况下得到少量的订单日志output@schu34那么这通常是个坏主意吗?为什么这不是一个常见的问题?在shell中使用CLI应用程序时,我习惯于只有一个输出流(
stdout
stderr
混合)。它认为,如果我有两个独立的输出流,有时可能很难跟踪哪个
stdout
日志条目对应于哪个
stderr
错误。:/我觉得我错过了显而易见的事情。
1stdout
2stderr
3stdout
let fd = createWriteStream('path', options)

// wait on fd 'open' event however you want to.

let results = child_process.spawnSync('ls', args, {stdio: [null, fd, fd]})

fs.closeSync(fd)