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


36

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

是否有某种方法可以使代码保持完整?

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

echo barney | grep barney | sed -n 1,$\ p   

4
PS ..作为一般信息。.我刚刚发现less可以接受彩色文本输入(不错:)...例如:tree -C ~/ |less -Rls -lR --color=always . |less -R
Peter.O 2011

Answers:


40

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

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

您还可以使用expect脚本unbuffer创建一个伪tty,如下所示:

echo barney | unbuffer grep barney | sed -n 1,$\ p

2
感谢您提供有关TTY检测和无缓冲伪造的信息!
shellter 2011年

@cjm ..在这里不起作用(在Ubuntu 10.04 / bash 4.1.5上)...但是我的10.04仓库只有-dev版本,在后端口中什么都没有...在这里有点晚了,所以我来看看明天再来一次...但是正如您所说的,这些着色程序可能会根据输出目标进行切换(嗯,但是他们怎么知道它对tty ..没关系)..他们很可能选择强制它..谢谢,,
Peter.O 2011年

@fred,他们通常使用isatty来确定stdout前进的方向。我实际上不确定在unbuffer将程序插入管道以及从管道中抽出时是否可行。我没有在这里安装尝试。
cjm 2011年

感谢您提供的unbuffer信息,它对我IRC bot的输出像在shell中的输出一样有帮助。
LiuYan刘研

4

这个对我有用 ;-!(在当前的MingW环境中)

echo barney | grep --color=always barney | sed -n '1,$p'
**barney**

#barney显示为红色文本

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1

@shellter ...是的,这个特定的grep示例也对我有用。.在您发布答案之前,我不知道该选项,所以谢谢您。我仍然想知道是否有某种通用的方法来执行此操作。...例如tree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ……也许(?)有一种方法可以欺骗管道以使其认为它正在输出到TTY ..或某些常规的解决方法。 。
Peter.O

我刚刚检查过man tree……它也有一个类似的选择,-C……也许这是输出颜色转义代码的程序的共同功能
。– Peter.O 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.