【问题标题】:In Node.js why does piping to child_process.stdout to process.stdout strip ANSI colors?在 Node.js 中,为什么管道到 child_process.stdout 到 process.stdout 会去除 ANSI 颜色?
【发布时间】:2020-03-10 19:33:10
【问题描述】:

在节点中,当我尝试生成一个子进程,然后监听 stdout 流数据并将其发送到 process.stdout ansi 颜色被剥离:

// Will not preserve tty colors
const cp = spawn(procExec, ['--production'])
cp.stdout.on('data', (buf) => {
  // can manipulate buf
  process.stdout.write(buf)
});

cp.stderr.on('data', (buf) => {
  // can manipulate buf
  process.stderr.write(buf)
});
// Also will not preserve tty colors
const cp = spawn(procExec, ['--production'])
cp.stdout.pipe(process.stdout);
cp.stderr.pipe(process.stderr);

查看节点文档,标准解决方案是使用 stdio 选项的各种可能性:

const cp = spawn('ls', ['-l'], {
  stdio: 'inherit'
})

const cp = spawn('ls', ['-l'], {
  stdio: [0,1,2]
})

const cp = spawn('ls', ['-l'], {
  stdio: [process.stdin,process.stdout,process.stderr]
})

这将在终端中保留 ANSI 颜色。

通常这很好,但这意味着在将流的输出发送到process.stdoutprocess.stderr 之前不可能对其进行操作。

一个。为什么管道到child_process.stdoutprocess.stdout 会剥离ANSI 颜色?听data事件的原因是一样的吗?

b.我怎样才能操纵流的输出(即更改文本)同时保持颜色?

【问题讨论】:

  • 可能是因为某些代码正在查看流以查看它是否要进入终端以确定是否应用 ANSI 颜色,并且当您通过管道传输时,它最终在终端中的事实被隐藏了来自 ANSI 颜色的来源。我的猜测是有一个流变量或方法覆盖表明它确实支持 ANSI 颜色。我以前研究过这个,但没有完全弄清楚,但我认为基本上是这样的。

标签: node.js


【解决方案1】:

无论如何我都不是这些方面的专家,但我从这个线程中的一个答案中得出的结论是,默认情况下,节点在使用 spawn 时不提供实际的 tty 流。为什么?因为这样做很昂贵,并且会因系统和外壳而异。相反,它作为一个包被维护为那些需要它的人https://www.npmjs.com/package/node-pty 这实际上是有道理的,因为它可能很大,一些用户甚至可能没有权限获得一个 tty shell,所以他们将非 tty 设置为 spawn 的默认值。它适用于许多情况,意味着节点核心的代码更少。归根结底,如果您需要,可能值得使用该软件包。我不知道你是否可以修改流,但如果你这样做了,那么你将需要处理其中包含 ansi 颜色代码的输出,这比标准字符串解析更棘手。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多