【发布时间】: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.stdout 或process.stderr 之前不可能对其进行操作。
一个。为什么管道到child_process.stdout 到process.stdout 会剥离ANSI 颜色?听data事件的原因是一样的吗?
b.我怎样才能操纵流的输出(即更改文本)同时保持颜色?
【问题讨论】:
-
可能是因为某些代码正在查看流以查看它是否要进入终端以确定是否应用 ANSI 颜色,并且当您通过管道传输时,它最终在终端中的事实被隐藏了来自 ANSI 颜色的来源。我的猜测是有一个流变量或方法覆盖表明它确实支持 ANSI 颜色。我以前研究过这个,但没有完全弄清楚,但我认为基本上是这样的。
标签: node.js