Что делает переключатель grep --color = auto?

8

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

Trolzen
источник

Ответы:

12

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

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

Обычно --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()

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

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

Деннис
источник
Как он узнает, пишет ли он в терминал или нет?
Тролзен
1
Для этого есть функция C Если вы включите заголовочный файл sdgstd.h, istty(stdout)возвращает, 0если выходные данные перенаправлены в файл.
Деннис
Я экспериментирую с портами Windows grepи lessиз проекта GnuWin (gnuwin32.sourceforge.net). cmd.exeулучшено с ansiconполезностью. less --color=autoработает должным образом: использует цвет, когда перенаправление не применяется, и не работает, когда вывод перенаправлен. Но grep --color=autoне печатает escape-последовательности в обоих случаях.
Тролзен
Я не могу понять, почему это происходит. Я думал, что эти утилиты имеют одинаковый код в версиях для Unix и Windows, и они довольно старые. Поэтому они должны вести себя одинаково.
Тролзен
Это ошибка в GnuWin32 grep тогда. На Ubuntu он ведет себя так, как я подробно изложил в своем ответе. Хотя оба они происходят из одного и того же исходного кода, всегда есть небольшие изменения, которые необходимо внести, если вы собираетесь компилировать на другой платформе. Также имейте в виду, что текущая версия grep в GnuWin32 - 2.5.4. Последняя версия в Ubuntu - 2.12.
Деннис