【问题标题】:Preserve order of `stdout` and `stderr` output of `child_process.spawnSync` subprocess in Node.js在 Node.js 中保留 `child_process.spawnSync` 子进程的 `stdout` 和 `stderr` 输出的顺序
【发布时间】:2018-01-17 22:22:28
【问题描述】:
const spawnSync = require('child_process').spawnSync;
let x = spawnSync('bash', ['-c', 'echo "1stdout" ; echo "2stderr" >&2 ; echo "3stdout"']);

bash 命令只是一个示例。命令可以是lswgetgit - 没关系。)

当然,我可以用x.stdoutstderrx.stderr访问子进程的stdout,所以我会得到

1stdout
3stdout

2stderr

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

的变量
1stdout
2stderr
3stdout

我感觉options.stdio 中有一些东西可以提供帮助,但我无法弄清楚。

【问题讨论】:

  • 您可以将 stdout 和 stderr 都通过管道传输到一个流中,然后再通过管道传输到变量中,但我怀疑获得一个无错误的实现将非常棘手,因为像 heroku 这样的大公司经常以当有很多输出时,我们的订单日志会稍微增加

标签: node.js pipe stdout child-process


【解决方案1】:

如果您可以将交织输出写入文件:

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)

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

【讨论】:

    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    相关资源
    最近更新 更多