auto
作为开关选项, grep 有什么作用--color
?grep 何时决定为匹配的字符串着色,何时不着色?
答案1
预期行为
使用 时--color=auto
,当(且仅当)输出直接写入终端且该终端能够显示彩色输出时,grep 将突出显示匹配的字符串。
通常,--color=auto
这就是你想要的。例如,如果你使用 grep 匹配 URL 并将其通过管道传输到 Wget,Wget 将看到\e[1;31mhttp://...
实际的 URL(并因此而阻塞)。
以下命令将产生彩色输出:
echo Super User | grep --color=auto Super
echo Super User | grep --color=always Super | cat
但是,此命令不应该:
echo Super User | grep --color=auto Super | cat
任何与此行为不一致的情况都应被视为错误。
源代码
随着--color=auto
最新的用于 Windows 的 Grep版本(2.5.4)——以及它所基于的原始 2.5.4——当且仅当条件满足时才对输出进行着色
isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")
为真,即当且仅当输出被写入终端时,环境变量TERM
已定义,并且终端未哑的。
这不会在 Windows 下产生所需的行为,因为TERM
通常未定义。解决此问题的一个简单方法是TERM=windows
在控制面板中设置。
最新版本grep(2.14)通过当且仅当条件满足时对输出进行着色来解决这个问题
isatty(STDOUT_FILENO) && should_colorize()
是正确的,其中should_colorize()
对于 POSIX 和 Win32 的定义不同:
对于前者,条件等同于 2.5.4 中的条件;对于后者,TERM
不需要设置环境变量(只是不能dumb
)。