bash - 颜色转义代码

arm*_*ino 6 linux bash colors ansi-escape

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

例如

$ echo -e "\033[31m -- Hello World! -- \033[m"
 -- Hello World! --
Run Code Online (Sandbox Code Playgroud)

管道less:

$ echo -e "\033[31m -- Hello World! -- \033[m" | less
ESC[31m -- Hello World! -- ESC[m
Run Code Online (Sandbox Code Playgroud)

我不知道如何其他工具一样ls,grep等能够输出色彩但它在管道输送到看起来不错less

eph*_*ent 9

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


seh*_*ehe 7

grep和friends检测输出是否到终端.当管道输送到较少时,它不是,因此它们禁用着色.

查看isatty输出是否为终端.

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

alias less='less -SR'
alias grep='grep --color=always'
Run Code Online (Sandbox Code Playgroud)

另请参阅ANSIFilter以反过来:从现有流中过滤ANSI转义(您也可以使用它来生成HTML,RTF以及可能的其他格式)


tia*_*mex 5

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

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

当你写作

grep -v "Dogs" list-of-animals | less
Run Code Online (Sandbox Code Playgroud)

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