Почему передача вывода 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] Я обычно говорю, потому что моя страница руководства говорит, что вы можете использовать "никогда", "всегда" и "авто". Возможно, "нет" и "никогда" являются синонимами.