2

У меня странная проблема. Мой 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 ответа3

4

Где я не прав?

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

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

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

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

1

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

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

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

1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .