Що робить перемикач grep --color = auto?


8

Який ефект має autoопція для --colorперемикача в греппі? Коли grep вирішує пофарбувати відповідні рядки, а коли ні?

Відповіді:


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()

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

Для перших умова еквівалентна умові 2,5,4; для останнього змінну навколишнього середовища TERMне потрібно встановлювати (просто не може бути dumb).


Як це дізнатися, записує він у термінал чи ні?
Trolzen

1
Для цього є функція C. Якщо ви включите файл заголовка sdgstd.h, istty(stdout)повертається, 0якщо вихід буде переспрямований у файл.
Денніс

Я експериментую з портами Windows grepі lessвід проекту GnuWin (gnuwin32.sourceforge.net). cmd.exeвдосконалюється ansiconкорисністю. less --color=autoпрацює як очікувалося: використовує колір, коли перенаправлення не застосовується, а не, коли вихід переспрямований. Але grep --color=autoв обох випадках не друкується послідовність втечі
Trolzen

Я не можу зрозуміти, чому це відбувається. Я подумав, що ці утиліти мають однаковий код і у версії Unix, і у Windows, і вони досить старі. Тому вони повинні поводитися однаково.
Trolzen

То помилка в грепі GnuWin32 тоді. У Ubuntu він поводиться так, як я детально пояснив у своїй відповіді. Хоча обидва походять з одного і того ж вихідного коду, завжди є незначні коригування, які потрібно внести, якщо ви збираєтесь компілювати на іншій платформі. Також майте на увазі, що поточна версія grep GnuWin32 становить 2.5.4. Остання версія на Ubuntu - 2.12.
Денніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.