8

Какой эффект имеет опция auto для опции --color в grep? Когда grep решает окрасить соответствующие строки, а когда нет?

1 ответ1

12

Ожидаемое поведение

С --color=auto , grep выделит совпадающие строки, если (и только если) вывод записывается непосредственно в терминал, и указанный терминал способен отображать цветной вывод.

Обычно, --color=auto - это то, что вы хотите. Если, например, вы используете grep для сопоставления URL-адреса и перенаправления его на Wget, Wget увидит \e[1;31mhttp://... вместо фактического URL-адреса (и заблокирует его).

Следующие команды должны привести к цветному выводу:

echo Super User | grep --color=auto Super
echo Super User | grep --color=always Super | cat

Эта команда, однако, не должна:

echo Super User | grep --color=auto Super | cat

Любое несоответствие с этим поведением должно рассматриваться как ошибка.

Исходный код

С параметром --color=auto последняя версия Grep для Windows (2.5.4), а также оригинальная версия 2.5.4, на которой она основана, окрашивают вывод в том и только в том случае, если условие

isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")

истина, т. е. если и только если выходные данные записываются в терминал, переменная окружения TERM определена, и терминал не тупой.

Это не приведет к желаемому поведению в Windows, поскольку TERM обычно не определяется. Простым решением этой проблемы является установка TERM=windows на панели управления.

Последняя версия grep (2.14) исправляет эту проблему, окрашивая вывод, если и только если условие

isatty(STDOUT_FILENO) && should_colorize()

Значение true, где should_colorize() определяется по-разному для POSIX и Win32:

Для первого условие эквивалентно условию 2.5.4; для последнего переменная TERM не должна быть установлена (она просто не может быть dumb).

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