Чи є якась змінна середовище?
Так. Це TERM
змінна середовище. Це тому, що є кілька речей, які використовуються як частина процесу прийняття рішення.
Тут важко узагальнити, оскільки не всі програми узгоджуються на єдиній блок-схемі прийняття рішень. Насправді, GNU grep
, згаданий у відповіді М. Кітта, є хорошим прикладом зовнішньої роботи, яка використовує дещо незвичний процес прийняття рішень з несподіваними результатами. Отже, в дуже загальних рисах:
- Стандартний вихід повинен бути кінцевим пристроєм, як визначено
isatty()
.
- Програма повинна мати можливість шукати запис для типу терміналу в базі даних termcap / terminfo.
- І тому повинен бути термінал типу , щоб подивитися вгору.
TERM
Змінна середовища повинна існувати і його значення повинно відповідати запису в базі даних.
- Тому повинна бути база даних terminfo / termcap. У деяких реалізаціях підсистеми розташування бази даних termcap може бути визначене за допомогою
TERMCAP
змінної середовища. Тож у деяких реалізаціях є друга змінна середовище.
- Запис termcap / terminfo повинен зазначати, що тип терміналу підтримує кольори. У
max_colors
терміналі є поле. Він не встановлений для типів терміналів, які насправді не мають кольорових можливостей. Дійсно, існує умова terminfo про те, що для кожного кольорового типу терміналів існує ще одна запис із назвою -m
або -mono
додана до імені, яка не містить можливості кольорів.
- Запис termcap / terminfo повинен передбачати шлях програми змінити кольори. Є терміни
set_a_foreground
і set_a_background
поля.
Це трохи складніше, ніж просто перевірка isatty()
. Це ще більше ускладнюється кількома речами:
- Деякі програми додають параметри командного рядка або прапори конфігурації, які перекривають
isatty()
перевірку, так що програма завжди або ніколи не передбачає, що в якості вихідного сигналу є (кольоровий) термінал. Наприклад:
- У GNU
ls
є параметр --color
командного рядка.
- BSD
ls
розглядає змінні середовища CLICOLOR
(його відсутність означає ніколи ) та CLICOLOR_FORCE
(його присутність означає завжди ), а також використовує параметр -G
командного рядка.
- Деякі програми не використовують termcap / terminfo і мають провідні відповіді на значення
TERM
.
- Не всі термінали використовують послідовності ECMA-48 або ISO 8613-6 SGR, які злегка названі "послідовностями втечі" ANSI, для зміни кольорів. Механізм termcap / terminfo фактично призначений для ізоляції додатків від прямого знання точних послідовностей управління. (Більше того, існує аргумент, що ніхто не використовує послідовності ISO 8613-6 SGR, оскільки всі погоджуються з помилкою використання напівколонки як роздільника для кольорових послідовностей RGB кольорів. Стандарт фактично визначає двокрапку.)
Як було сказано, GNU grep
фактично проявляє деякі з цих додаткових складностей. Він не консультує termcap / terminfo, провідне з'єднання керуючих послідовностей для випромінювання та жорсткий провід відповіді на TERM
змінну середовища.
Порт Linux / Unix цього є цей код , який дозволяє colourization тільки тоді , коли TERM
змінна оточення існує і його значення не збігається Проводове ім'я dumb
:
int
слід_колоризувати (недійсно)
{
char const * t = getenv ("TERM");
повернути t && strcmp (t, "німий")! = 0;
}
Таким чином , навіть якщо ваш TERM
IS xterm-mono
, GNU grep
вирішить випускають квіти, навіть якщо інші програми , такі , як vim
не буде.
Порт Win32 нього є цей код , який дозволяє colourization або коли TERM
змінна оточення НЕ існує , або якщо вона існує , і його значення не збігається Проводове ім'я dumb
:
int
слід_колоризувати (недійсно)
{
char const * t = getenv ("TERM");
повернення! (t && strcmp (t, "німий") == 0);
}
grep
Проблеми GNU з кольором
grep
Кольорованість GNU насправді горезвісна. Оскільки він насправді не справляє належну роботу зі створення термінального виходу, а просто звинувачує декілька послідовностей керованого проводу в різних точках свого виводу, марно сподіваючись, що це досить добре, він фактично показує неправильний вихід у певних обставинах.
У цих обставинах доводиться розфарбувати щось, що знаходиться з правого краю терміналу. Програми, які правильно виконують термінальний вихід, повинні враховувати автоматичні правильні поля. На додаток до незначної можливості того, що термінал може не мати їх (а саме auto_right_margin
поле у terminfo), поведінка терміналів, які мають автоматичні праві поля, часто слідує за прецедентом DEC VT від обгортання відкладених рядків . GNU grep
цього не враховує, наївно очікуючи негайного загортання рядків , і його кольоровий вихід йде не так.
Кольоровий вихід - справа не проста.
Подальше читання