Какой эффект имеет auto
опция для --color
switch в 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
в панели управления.
Последняя версиягрэп(2.14) устраняет эту проблему, раскрашивая выходные данные тогда и только тогда, когда выполняется условие
isatty(STDOUT_FILENO) && should_colorize()
верно, где should_colorize()
определяется по-разному для POSIX и Win32:
Для первого случая условие эквивалентно условию 2.5.4; для второго случая переменная окружения TERM
не обязательно должна быть установлена (она просто не может быть установлена dumb
).