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

2966
Trolzen

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

8

1 ответ на вопрос

12
Dennis

Expected behavior

With --color=auto, grep will highlight matching strings if (and only if) the output is written directly to the terminal and said terminal is capable of displaying colored output.

Normally, --color=auto is what you want. If, e.g., you use grep to match a URL and pipe it to Wget, Wget will see \e[1;31mhttp://... instead of the actual URL (and choke on it).

The following commands should result in colored output:

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

This command, however, should not:

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

Any inconsistency with this behavior should be considered a bug.

Source code

With --color=auto, the latest Grep for Windows version (2.5.4) – as well as the original 2.5.4 it is based on – color the output if and only if the condition

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

is true, i.e., if and only if the output is being written to a terminal, the environment variable TERM is defined and the terminal is not dumb.

This won't produce the desired behavior under Windows, since TERM is normally not defined. An easy solution to this problem is setting the TERM=windows in the control panel.

The latest version of grep (2.14) fixes this issue by coloring the output if and only if the condition

isatty(STDOUT_FILENO) && should_colorize() 

is true, where should_colorize() is defined differently for POSIX and Win32:

For the former, the condition is equivalent to the one of 2.5.4; for the latter, the enviroment variable TERM doesn't have to be set (it just can't be dumb).

Как он узнает, пишет ли он в терминал или нет? Trolzen 11 лет назад 0
Для этого есть функция C Если вы включаете заголовочный файл `sdgstd.h`,` istty (stdout) `возвращает` 0`, если вывод перенаправляется в файл. Dennis 11 лет назад 1
Я экспериментирую с окнами портов `grep` и` less` из проекта GnuWin (gnuwin32.sourceforge.net). Файл cmd.exe улучшен с помощью утилиты ansicon. `less --color = auto` работает должным образом: использует цвет, когда перенаправление не применяется, и не используется, когда вывод перенаправлен. Но `grep --color = auto` не печатает escape-последовательности в обоих случаях. Trolzen 11 лет назад 0
Я не могу понять, почему это происходит. Я думал, что эти утилиты имеют одинаковый код как в версиях для Unix, так и для Windows, и они довольно старые. Поэтому они должны вести себя одинаково. Trolzen 11 лет назад 0
Это ошибка в GnuWin32 grep тогда. На Ubuntu он ведет себя так, как я подробно изложил в своем ответе. Хотя оба они происходят из одного и того же исходного кода, всегда есть небольшие изменения, которые необходимо внести, если вы собираетесь компилировать на другой платформе. Кроме того, имейте в виду, что текущая версия grep в GnuWin32 - 2.5.4. Последняя версия в Ubuntu - 2.12. Dennis 11 лет назад 0
Я загрузил исходники для grep-2.14, coreutils-8.20, diffutils-3.2, gawk-4.0.1 с http://ftp.gnu.org/gnu/ и не нашел ни `sdgstd`, ни` istty` ( в gawk встречается несколько случаев `istty`, но это не вызовы функций, а имена переменных) Trolzen 11 лет назад 0
В Windows вы должны использовать `_isatty (_fileno (stdout))`. Вам нужно включить либо `io.h`, либо` unistd.h`. Dennis 11 лет назад 0
Я думаю, что я не был ясен. Я загрузил исходники для _linux_ версий. И в этих _linux_ источниках нет строк вроде isatty. Trolzen 11 лет назад 0
Ах, я думал, что вы хотите исправить версию для Windows ... Она не должна быть isatty; это был просто пример. `isatty (fileno (stdout))` также будет работать, и, возможно, есть несколько других способов. Dennis 11 лет назад 0
На самом деле да, я хотел бы исправить версию Windows. Поэтому я хочу понять, почему существует разница между версиями и как программы определяют, пишут ли они в терминал или нет. Есть ли другие функции, кроме `istty ()` и `_isatty ()`? Trolzen 11 лет назад 0
Он находится в `main.c`, строка` 2185`: `if (color_option == 2) color_option = isatty (STDOUT_FILENO) && should_colorize ();` Dennis 11 лет назад 0
Я наконец разобрался. `grep` не только вызывает` isatty () `, он проверяет переменную окружения` TERM` (в отличие от `ls`). Если он не определен (в Windows это обычно так), то `grep` не использует цвета. В Linux также есть ситуации, когда `TERM` не определен. Trolzen 11 лет назад 0
Отредактировал ответ. Пара замечаний: 1) нет функции `istty`, возможно, опечатка и 2) я не знаю, почему я написал` less` выше, я имел в виду `ls` :-). @dennis спасибо за помощь! Trolzen 11 лет назад 0
не могли бы вы добавить это изменение в ответ? http://superuser.com/review/suggested-edits/50586 Trolzen 11 лет назад 0
Я отредактировал свой ответ, чтобы включить информацию, которую вы упомянули. Функция `istty` существует, но она является частью [Thinkage GCOS] (http://www.thinkage.ca/english/gcos/index.shtml), а не стандартными библиотеками. Dennis 11 лет назад 0