Какой эффект имеет опция auto
для опции --color
в grep? Когда grep решает окрасить соответствующие строки, а когда нет?
1 ответ
Ожидаемое поведение
С --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
).