Answers:
大多数此类程序默认情况下仅将颜色代码输出到终端。他们使用来检查其输出是否为TTY isatty(3)。通常,有一些选项可以替代此行为:在所有情况下都禁用颜色,或者在所有情况下都启用颜色。grep例如,对于GNU ,--color=never禁用颜色并--color=always启用它们。
在外壳程序中,您可以使用-t test运算符执行相同的测试:[ -t 1 ]仅当标准输出为终端时,该测试才会成功。
是否有一些环境变量?
是。它是TERM环境变量。这是因为在决策过程中有几件事被使用。
在这里很难一概而论,因为并非所有程序都在一个决策流程图上达成一致。实际上GNUgrep,在M. Kitt的回答中提到的是一个离群值的好例子,该离群值使用了一些异常的决策过程并产生了意外的结果。因此,从一般意义上讲:
isatty()。TERM环境变量必须存在和它的价值必须与数据库记录相匹配。TERMCAP环境变量指定termcap数据库的位置。因此,在一些实现有一个第二环境变量。max_colorsterminfo中有一个字段。未为实际上不具有颜色功能的终端类型设置此功能。确实,有一个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_marginterminfo中的字段),具有自动右边界的终端的行为通常遵循挂起换行的DEC VT先例。GNU grep并没有考虑到这一点,天真地希望立即换行,并且其彩色输出出错。
彩色输出不是一件容易的事。
grep --color未显示正确的输出 ”。xterm常见问题解答。隐形岛。$TERM没有解释。(您的回答总体上很有趣,但我认为它不能解决问题...)