当我通过管道传输到另一个进程时,我的 ANSI 转义码去哪里了?我可以保留它们吗?

Pet*_*r.O 41 command-line colors pipe escape-characters

有时我想通过管道传输进程的颜色编码输出,例如。grep ...但是当我将它输送到另一个进程时,例如。sed,颜色代码丢失了......

有什么方法可以保持这些代码完好无损吗?

这是一个丢失彩色输出的示例:

echo barney | grep barney | sed -n 1,$\ p   
Run Code Online (Sandbox Code Playgroud)

cjm*_*cjm 46

许多生成彩色输出的程序会检测它们是否正在写入 TTY,如果不是,则关闭颜色。这是因为当您只想捕获文本时,颜色代码很烦人,因此它们会尝试自动“做正确的事情”。

从这样的程序中捕获颜色输出的最简单方法是告诉它即使没有连接到 TTY 也写颜色。您必须阅读该程序的文档以了解它是否具有该选项。(例如,grep--color=always选择权。)

您还可以使用该expect脚本unbuffer来创建这样的伪 tty:

echo barney | unbuffer grep barney | sed -n 1,$\ p
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供有关 TTY 检测和 unbuffer fake-out 的信息! (3认同)