nodejs命令行,子进程我是用了colors打印,父进程如何得到。

nodejs命令行,子进程我是用了colors打印,父进程如何得到。

子进程aaa.js

require("colors")
console.log("aaa".red)

父进程run.js

require('child_process').exec("node aaa",{ stdio: "inherit"},function (err,out) {
  console.log(out)
})

如何能带颜色啊。

阅读 2.6k
1 个回答

你可以使用下面代码实现你需要的效果:

require('child_process').spawn('node', ['aaa'], { stdio: 'inherit' })

但是如果你需要细致的理解,首先要知道终端是怎么控制输出的颜色的。
转义序列(1)是终端用来控制颜色的特殊字符序列的,这部分的
由于是控制字符序列,所以他们是不可见的,
转义序列由 ESC(2)[ 开始,然后紧跟着parameter bytes,范围在0x30–0x3F,再后面是intermediate bytes,范围在0x20–0x2F,最后跟着final byte,范围在0x40–0x7E。

看下面的代码就更能理解了:

require("colors")

// 31 in 30–37    Set foreground color
// 39           Default foreground color
var redStringUnicode = '\u001b[31maaa\u001b[39m'
var redStringAscii = '\033[31maaa\033[39m'
var redStr = "aaa".red
console.log('unicode :', redStringUnicode)
console.log('unicode length:', redStringUnicode.length)  // 13
console.log('ascii escape:', redStringAscii)
console.log('ascii escape length:', redStringAscii.length)  // 13
console.log('colors:', redStr)
console.log('colors length:', redStr.length) // 13
console.log(redStr === redStringAscii) // true
console.log(redStr === redStringUnicode) // true
console.log(redStringAscii === redStringUnicode) // true

其中,之所以经过父子进程通信之后,颜色就不显示了,是因为 colors 库中有个 supports-colors.js 逻辑来判断是否支持颜色,其中有一句:

if (process.stdout && !process.stdout.isTTY) {
    return false;
}

而使用 exec 方法执行命令,则子进程的 stdio 就与 tty(终端)失去了联系,也就是 process.stdout.isTTY === 'undefined',只要保证 `process.stdout 对应为终端输出流即可

注解

  • (1) 其实转义序列分为多种,这里指的只是 CSI - Control Sequence Introducer 一类
  • (2) ESC 的Ascii码为27,Unicode码为U+001B
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏