我有一个脚本,它使用转义码在其输出中突出显示文本匹配。一切都很好,除非输出通过管道传输到less
,打印转义码
e.g。
$ 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
我想知道其他工具如ls
,grep
等是如何能够以彩色输出的,但是当它传送到less
时看起来很好?
答案 0 :(得分:9)
使用less -R
或将LESS=-R
添加到环境中。这要求less
将一些转义序列(如颜色)传递给终端,而不是将它们打印为普通字符。
答案 1 :(得分:7)
grep和friends检测输出是否是终端。当管道输送到较少时,它不会,因此它们会禁用着色。
查看isatty
以检查输出是否为终端。
请注意,我有时觉得这很烦人,因为我希望少来显示颜色:
alias less='less -SR'
alias grep='grep --color=always'
另请参阅ANSIFilter反过来:从现有流中过滤ANSI转义(您也可以使用它来生成HTML,RTF以及可能的其他格式)
答案 2 :(得分:5)
您提到的大多数工具都调用C函数isatty()来确定进程的相关文件描述符(在本例中为stdout)是否转到终端。
如果输出是针对终端的,则它们启用颜色,突出显示,发出蜂鸣声或者他们认为人类用户可以从中获得价值的任何其他功能。如果没有终端,他们会输出原始文本以消化其他工具。
写作时
grep -v "Dogs" list-of-animals | less
来自grep的isatty()调用运行在通向管道的文件描述符上,而不是终端上。所以它返回零,errno设置为EINVAL或ENOTTY,grep输出适合较少的原始文本。
答案 3 :(得分:2)
如果要允许less将颜色转义序列传递给终端:
> echo -e "\033[31m -- Hello World! -- \033[m" | less -R
...或者如果你想传递所有转义序列:
> echo -e "\033[31m -- Hello World! -- \033[m" | less -r