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


Answers:


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

但是,此命令不应:

echo Super User | grep --color=auto Super | cat

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

源代码

使用--color=autoWindows的最新Grep版本(2.5.4)以及基于它的原始2.5.4都会在且仅当条件为输出时为输出着色

isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")

为true,即,且仅当将输出写入终端时,才定义环境变量TERM且终端不

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

grep(2.14)的最新版本通过以下方式为输出着色,从而解决了此问题:

isatty(STDOUT_FILENO) && should_colorize()

是正确的,should_colorize()对于POSIX和Win32的定义不同:

对于前者,条件等于2.5.4中的一个。对于后者,TERM不需要设置enviroment变量(就不能设置dumb)。


如何确定是否写入终端?
Trolzen

1
有一个C函数。如果包含头文件sdgstd.h,则istty(stdout)返回0是否将输出重定向到文件。
丹尼斯

我实验的Windows移植grepless自GnuWin项目(gnuwin32.sourceforge.net)。实用性cmd.exe得到改善ansiconless --color=auto正常工作:不应用重定向时使用颜色,在重定向输出时不使用颜色。但是grep --color=auto在两种情况下都不会输出转义序列。
Trolzen

我不明白为什么会这样。我认为这些实用程序在Unix和Windows版本中都具有相同的代码,并且它们已经很老了。因此,它们的行为应相同。
Trolzen

那是GnuWin32的grep中的一个错误。在Ubuntu上,它的行为与我在答案中详述的一样。虽然两者都源于相同的源代码,但是如果要在其他平台上进行编译,则始终必须进行一些小的调整。另外,请记住,GnuWin32的当前grep版本是2.5.4。Ubuntu的最新版本是2.12。
丹尼斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.