Почему передача вывода 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=none в grep, все отлично.

Где я не прав?

3 ответа

Решение

Это может быть сломанный псевдоним. Посмотрите на /home/USERNAME/.bashrc (/root/.bashrc) Если вы видите

псевдоним grep="grep -ARG1 -ARG2"

удалите его или настройте по своему усмотрению.

Где я не прав?

Вот проблема: вы анализируете выходные данные команды, которая выплевывает имена файлов. Вы никогда не должны делать это. И если вы это сделаете, вы должны убедиться, что выходные данные правильно сформированы и имена файлов правильно разграничены. *

Обычно имена файлов по конвейеру xargs "просто работает", и это "достаточно хорошее" решение, но оно не будет работать, если команда вставляет символы управления цветом в свой стандартный вывод. Вывод предназначен для чтения человеком, на терминале, а не другими командами.

Реальный вопрос: почему ты делаешь | xargs ls когда grep уже печатает имена файлов?

* Например, find … -print0 | xargs -0 это конструкция, которая разделяет файлы с единственным символом, который не разрешен в именах файлов, поэтому вы будете в безопасности там. Тем не менее, в большинстве этих случаев find … -exec будет работать так же хорошо.

Обычно есть [0] 3 аргумента, которые можно использовать с --color возможность grep: "авто", "всегда" и "нет". Похоже твой grep может быть псевдоним для использования --color always, в этом случае управляющие коды ANSI, используемые для раскрашивания выходных данных, мешают lsспособность показать им. Когда вы используете --color=noneскажи grep не использовать их, исправляя вашу проблему. auto Параметр является хорошим компромиссом: он говорит об использовании цвета, когда вывод является терминалом, но не в том случае, если вывод является файлом или конвейером, или вообще чем-то другим, где коды ANSI не будут работать должным образом.

Тем не менее, slhck прав, и вам, вероятно, не нужно обрезать вывод grep в этом случае, но хорошо бы понять связанные с цветом проблемы на будущее.

[0] Я обычно говорю, потому что моя страница руководства говорит, что вы можете использовать "никогда", "всегда" и "авто". Возможно, "нет" и "никогда" являются синонимами.

Другие вопросы по тегам