bash – 颜色转义代码

我有一个脚本使用转义代码来突出显示其输出中的文本匹配。 除了输出pipe道less ,所有的都是好的,这会打印出转义码

例如

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

pipe道less

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

我想知道如何像lsgrep等其他工具能够输出颜色,但它看起来不错,当pipe道less

你提到的大多数工具都调用了C函数isatty(),它决定了进程的相关文件描述符(在这个例子中是标准输出)是否要去终端。

如果输出是针对终端的,他们可以使用颜色,突出显示,发出嘟嘟声或其他任何他们认为会从中获得价值的功能。 如果没有终端,他们输出原始文本消解其他工具。

当你写

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

来自grep的isatty()调用在通向管道的文件描述符上运行,而不是在终端上运行。 所以它返回零,errno被设置为EINVAL或ENOTTY,grep输出的原始文本适合较少。

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

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

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

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

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

也可以看看ANSIFilter的反面:将ANSI转义符从现有的流中过滤掉(也可以用它来生成HTML,RTF以及其他可能的格式)

如果您希望减少将颜色转义序列传递到终端:

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

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

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