我遇到了一个奇怪的问题。我的grep
输出是彩色的,如果我执行以下操作:
grep -lr '80' /etc/apache2/sites-available/|xargs ls
我有:
ls: cannot access /etc/apache2/sites-available/default: No such file or directory
但如果我添加--colour=none
到grep
,一切就都好了。
我哪里错了?
答案1
这可能是一个损坏的别名。看看你的/home/用户名/.bashrc (/root/.bashrc) 如果你看到
别名 grep="grep -ARG1 -ARG2"
删除它或者按照你的喜好自定义它。
答案2
我哪里错了?
问题在于:你正在解析一个输出文件名的命令的输出。你应该绝不这样做。如果这样做,您需要确保输出格式正确且文件名正确分隔。*
通常将文件名通过管道传输到xargs
“刚好可行”并且这是一个“足够好”的解决方案,但如果命令在其标准输出中插入彩色控制字符,它将不起作用。输出旨在供人类在终端上阅读,而不是供其他命令阅读。
真正的问题是:| xargs ls
当grep
已经打印出文件名时你为什么还要这么做?
* 例如,find … -print0 | xargs -0
是一种使用文件名中唯一不允许的字符来分隔文件的构造,因此您在这里是安全的。但是,在大多数情况下,它find … -exec
也能正常工作。
答案3
通常[0] 有 3 个参数可以与选项一起使用--color
:grep
“auto”、“always”和“none”。似乎您的grep
别名可能是 use --color always
,在这种情况下,用于为输出着色的 ANSI 转义码会干扰 的ls
显示能力。当您使用 时--color=none
,您会告诉grep
不要使用这些,从而解决您的问题。该auto
选项是一个很好的折衷方案:它表示在输出是终端时使用颜色,但如果输出是文件或管道,或者通常是 ANSI 代码无法按预期工作的其他东西,则不使用颜色。
也就是说,slhck 是正确的,在这种情况下您可能不需要将输出传输grep
到任何东西,但了解未来与颜色相关的问题是有好处的。
[0] 我说通常,是因为我的手册页说可以使用“never”、“always”和“auto”。也许“none”和“never”是同义词。