7

我有一个脚本,它使用转义码在其输出中突出显示文本匹配。一切都很好,除非输出通过管道传输到less打印转义码

例如

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

输送到less

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

我想知道其他工具(如lsgrep等)如何能够以颜色输出,但在管道传输时看起来还不错less

4

4 回答 4

10

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

于 2011-11-22T00:08:22.523 回答
8

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

查看isatty输出是否为终端。

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

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

反过来看一下ANSIFilter:从现有的流中过滤掉 ANSI 转义(你也可以用它来生成 HTML、RTF 和可能的其他格式)

于 2011-11-22T00:06:41.240 回答
6

您提到的大多数工具都调用 C 函数 isatty() ,该函数确定进程的相关文件描述符(在本例中为标准输出)是否将发送到终端。

如果输出用于终端,它们会启用颜色、突出显示、发出哔声或任何其他他们认为人类用户会从中获得价值的功能。如果没有终端,它们会输出原始文本以供其他工具消化。

当你写

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

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

于 2011-11-22T00:06:17.523 回答
3

如果您想允许 less 将颜色转义序列传递给终端:

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

...或者如果您想传递所有转义序列:

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

于 2011-11-22T00:07:49.457 回答