grep 开关 --color=auto 有什么作用?

Tro*_*zen 8 windows grep command-line gnuwin32

auto作为--colorswitch的选项在 grep 中有什么影响?grep 什么时候决定为匹配的字符串着色,什么时候不呢?

Den*_*nis 12

预期行为

使用--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
Run Code Online (Sandbox Code Playgroud)

但是,此命令不应:

echo Super User | grep --color=auto Super | cat
Run Code Online (Sandbox Code Playgroud)

与此行为的任何不一致都应视为错误。

源代码

使用--color=auto,最新的Grep for Windows版本 (2.5.4) – 以及它基于的原始 2.5.4 – 当且仅当条件满足时为输出着色

isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")
Run Code Online (Sandbox Code Playgroud)

为真,即,当且仅当将输出写入终端时,环境变量TERM已定义且终端不愚蠢

这不会在 Windows 下产生所需的行为,因为TERM通常没有定义。解决此问题的一个简单方法是TERM=windows在控制面板中设置 。

最新版本的grep (2.14) 通过当且仅当条件满足时为输出着色来解决此问题

isatty(STDOUT_FILENO) && should_colorize()
Run Code Online (Sandbox Code Playgroud)

是真的,其中should_colorize()POSIX 和 Win32 的定义不同:

对于前者,条件相当于2.5.4中的一个;对于后者,TERM不必设置环境变量(它只是不能dumb)。