2011-11-22 79 views
5

我有一个脚本使用转义代码来突出显示其输出中的文本匹配。除了当输出传送到less时,除了打印转义码bash - 颜色转义代码

$ echo -e "\033[31m -- Hello World! -- \033[m" 
-- Hello World! -- 

管道输送到less:当管道输送到less

$ echo -e "\033[31m -- Hello World! -- \033[m" | less 
ESC[31m -- Hello World! -- ESC[m 

我想知道其他工具,如lsgrep,等等都能够在彩色输出但它看起来不错?

回答

5

您提到的大多数工具都调用C函数isatty(),它决定进程的相关文件描述符(在本例中为stdout)是否要发送到终端。

如果输出是针对终端的,它们将启用颜色,突出显示,发出蜂鸣声或他认为人类用户将从中获得价值的任何其他功能。如果没有终端,他们会输出原始文本来消解其他工具。

当你写

grep -v "Dogs" list-of-animals | less 

可以从grep的isatty()为其调用运行在文件描述符导致管,不是你的终端。所以它返回零,errno被设置为EINVAL或ENOTTY,并且grep输出适合于较少的原始文本。

+0

明白了。感谢您的解释。 – armandino

6

grep和朋友检测是否输出到终端。当传送到较少,它不是,所以他们禁用着色。

查看isatty来检查输出是否是终端。

注意,我有时会觉得这很烦人,因为少,显示颜色

alias less='less -SR' 
alias grep='grep --color=always' 

也期待在ANSIFilter为反向:过滤ANSI逸出现有的流(你也可以用它来产生HTML,RTF和其他可能的格式)

2

如果你想允许更少的颜色转义序列到终端:

> echo -e "\033[31m -- Hello World! -- \033[m" | less -R

...或者,如果你想通过所有的转义序列:

> echo -e "\033[31m -- Hello World! -- \033[m" | less -r

+0

+1 :-)另外:谷歌“ansi转义码”,和:http://www.linuxfocus.org/English/May2004/article335.shtml – Tilo

9

使用less -R或添加LESS=-R环境。这要求less将一些转义序列(如颜色)传递给终端,而不是将它们打印为普通字符。

+0

这正是我正在寻找谢谢。 – jimh