为什么将 grep 输出通过管道传输到 xargs 中不能使用颜色?

为什么将 grep 输出通过管道传输到 xargs 中不能使用颜色?

我遇到了一个奇怪的问题。我的grep输出是彩色的,如果我执行以下操作:

grep -lr '80' /etc/apache2/sites-available/|xargs ls

我有:

ls: cannot access /etc/apache2/sites-available/default: No such file or directory

但如果我添加--colour=nonegrep,一切就都好了。

我哪里错了?

答案1

这可能是一个损坏的别名。看看你的/home/用户名/.bashrc (/root/.bashrc) 如果你看到

别名 grep="grep -ARG1 -ARG2"

删除它或者按照你的喜好自定义它。

答案2

我哪里错了?

问题在于:你正在解析一个输出文件名的命令的输出。你应该绝不这样做。如果这样做,您需要确保输出格式正确且文件名正确分隔。*

通常将文件名通过管道传输到xargs“刚好可行”并且这是一个“足够好”的解决方案,但如果命令在其标准输出中插入彩色控制字符,它将不起作用。输出旨在供人类在终端上阅读,而不是供其他命令阅读。

真正的问题是:| xargs lsgrep已经打印出文件名时你为什么还要这么做?

* 例如,find … -print0 | xargs -0是一种使用文件名中唯一不允许的字符来分隔文件的构造,因此您在这里是安全的。但是,在大多数情况下,它find … -exec也能正常工作。

答案3

通常[0] 有 3 个参数可以与选项一起使用--colorgrep“auto”、“always”和“none”。似乎您的grep别名可能是 use --color always,在这种情况下,用于为输出着色的 ANSI 转义码会干扰 的ls显示能力。当您使用 时--color=none,您会告诉grep不要使用这些,从而解决您的问题。该auto选项是一个很好的折衷方案:它表示在输出是终端时使用颜色,但如果输出是文件或管道,或者通常是 ANSI 代码无法按预期工作的其他东西,则不使用颜色。

也就是说,slhck 是正确的,在这种情况下您可能不需要将输出传输grep到任何东西,但了解未来与颜色相关的问题是有好处的。

[0] 我说通常,是因为我的手册页说可以使用“never”、“always”和“auto”。也许“none”和“never”是同义词。

相关内容