Answers:
大多数此类程序默认情况下仅将颜色代码输出到终端。他们使用来检查其输出是否为TTY isatty(3)
。通常,有一些选项可以替代此行为:在所有情况下都禁用颜色,或者在所有情况下都启用颜色。grep
例如,对于GNU ,--color=never
禁用颜色并--color=always
启用它们。
在外壳程序中,您可以使用-t
test
运算符执行相同的测试:[ -t 1 ]
仅当标准输出为终端时,该测试才会成功。
是否有一些环境变量?
是。它是TERM
环境变量。这是因为在决策过程中有几件事被使用。
在这里很难一概而论,因为并非所有程序都在一个决策流程图上达成一致。实际上GNUgrep
,在M. Kitt的回答中提到的是一个离群值的好例子,该离群值使用了一些异常的决策过程并产生了意外的结果。因此,从一般意义上讲:
isatty()
。TERM
环境变量必须存在和它的价值必须与数据库记录相匹配。TERMCAP
环境变量指定termcap数据库的位置。因此,在一些实现有一个第二环境变量。max_colors
terminfo中有一个字段。未为实际上不具有颜色功能的终端类型设置此功能。确实,有一个terminfo约定,对于每种可着色的终端类型,都存在另一条记录,该记录带有-m
或-mono
附加了没有颜色功能的名称。set_a_foreground
和set_a_background
字段。它比仅检查要复杂一些isatty()
。有几件事使它变得更加复杂:
isatty()
检查的命令行选项或配置标志,因此该程序始终或永远不会假定其具有(可着色的)终端作为其输出。举些例子:
ls
具有--color
命令行选项。ls
查看环境变量CLICOLOR
(其缺失表示Never)和CLICOLOR_FORCE
(存在度始终表示)环境变量,并使用-G
命令行选项。TERM
。如前所述,GNU grep
实际上表现出其中一些额外的复杂性。它不参考termcap / terminfo,硬连接要发出的控制序列,硬连接对TERM
环境变量的响应。
它的Linux / Unix端口具有以下代码,该代码仅在TERM
环境变量存在且其值与硬接线名称不匹配时才启用着色dumb
:
整型 should_colorize(无效) { char const * t = getenv(“ TERM”); 返回t && strcmp(t,“ dumb”)!= 0; }
因此,即使您TERM
是xterm-mono
,GNU grep
也会决定发出颜色,即使其他程序vim
也不会。
它的Win32端口具有以下代码,当TERM
环境变量不存在或环境变量存在且其值与硬接线名称不匹配时,可以启用着色dumb
:
整型 should_colorize(无效) { char const * t = getenv(“ TERM”); 退货!(t && strcmp(t,“ dumb”)== 0); }
grep
的颜色问题GNU grep
的着色实际上是臭名昭著的。因为它实际上并没有正确地构建终端输出,而只是在输出的各个点责备几个硬接线控制序列,但徒劳地希望这足够好,所以在某些情况下它实际上显示了错误的输出。
在这些情况下,必须在终端的右边缘上涂一些颜色。正确执行终端输出的程序必须考虑自动右边距。 除了终端可能没有它们的可能性很小(请参阅auto_right_margin
terminfo中的字段),具有自动右边界的终端的行为通常遵循挂起换行的DEC VT先例。GNU grep
并没有考虑到这一点,天真地希望立即换行,并且其彩色输出出错。
彩色输出不是一件容易的事。
grep --color
未显示正确的输出 ”。xterm常见问题解答。隐形岛。$TERM
没有解释。(您的回答总体上很有趣,但我认为它不能解决问题...)