Когда я выполняю команду из терминала, который печатает цветной вывод (например, ls
или gcc
), цветной вывод печатается. Насколько я понимаю, процесс фактически выводит управляющие коды ANSI , а терминал форматирует цвет.
Однако, если я выполню ту же команду другим процессом (скажем, пользовательским приложением C) и перенаправлю вывод в собственный вывод приложения, эти цвета не сохранятся.
Как программа решает, выводить ли текст в цветном формате или нет? Есть ли переменная окружения?
Да. Это
TERM
переменная окружения. Это потому, что есть несколько вещей, которые используются как часть процесса принятия решений.Здесь сложно обобщить, потому что не все программы согласовывают единую схему принятия решений. На самом деле GNU
grep
, упомянутый в ответе М. Китта, является хорошим примером выброса, который использует несколько необычный процесс принятия решений с неожиданными результатами. Поэтому в общих чертах:isatty()
.TERM
Переменная среды должна существовать и его значение должно соответствовать записи в базе данных.TERMCAP
переменной среды. Так что на некоторых реализациях есть второй переменная окружения.max_colors
terminfo есть поле. Он не установлен для типов терминалов, которые на самом деле не имеют цветовых возможностей. Действительно, есть TERMINFO соглашение , что для каждого типа терминала благовидного есть другая запись с-m
или-mono
добавляется к имени , которое не заявляет нет возможности цвета.set_a_foreground
иset_a_background
поля в terminfo.Это немного сложнее, чем просто проверка
isatty()
. Он сделан дополнительно осложняется несколькими вещами:isatty()
проверку, так что программа всегда или никогда не предполагает, что в качестве ее вывода используется (окрашиваемый) терминал. Например:ls
имеет параметр--color
командной строки.ls
рассматриваетCLICOLOR
(его отсутствие означает никогда ) иCLICOLOR_FORCE
(его присутствие означает всегда ) переменные окружения, а также использует параметр-G
командной строки.TERM
.Как уже упоминалось, GNU на
grep
самом деле демонстрирует некоторые из этих дополнительных сложностей. Он не обращается к termcap / terminfo, жестко связывает последовательности управления для передачи и передает ответ наTERM
переменную окружения.Порт Linux / Unix этого есть этот код , который позволяет colourization только тогда , когда
TERM
переменная окружения существует и его значение не совпадает Проводное имяdumb
:Так что, даже если
TERM
это такxterm-mono
, GNUgrep
решит испускать цвета, хотя другие программы, такие какvim
, не будут.Порт Win32 него есть этот код , который позволяет colourization либо когда
TERM
переменная окружения не существует , или если она существует , и его значение не совпадает Проводное имяdumb
:grep
Проблемы GNU с цветомgrep
Окраска GNU на самом деле печально известна. Поскольку он на самом деле не выполняет надлежащую работу по построению вывода терминала, а просто обвиняет в нескольких зашитых последовательностях управления в различных точках его вывода в тщетной надежде, что это достаточно хорошо, он на самом деле отображает неправильный вывод в определенных обстоятельствах.В этих обстоятельствах нужно раскрасить что-то, что находится на правом краю терминала. Программы, которые правильно выводят данные с терминала, должны учитывать правильные поля справа. В дополнение к небольшой вероятности того, что терминал может их не иметь (а именно
auto_right_margin
поле в terminfo), поведение терминалов, которые имеют автоматические правые поля, часто соответствует прецеденту DEC VT для переноса ожидающих строк . GNUgrep
не учитывает это, наивно ожидая немедленного переноса строки , и его цветной вывод идет неправильно.Цветной вывод не простая вещь.
дальнейшее чтение
grep --color
Не показывает правильный вывод ». xterm FAQ . Невидимый остров.источник
$TERM
не объясняет это (Ваш ответ в целом интересен, но я не думаю, что он отвечает на вопрос ...)Команда
unbuffer
из ожидаемого пакета разделяет выходные данные из первой программы и входные данные для второй программы.Вы бы использовали это так:
Я все время использую его с ansible и самодельным сценарием ctee, чтобы видеть вывод цвета на терминале, оставляя файл журнала с обычным (нецветным) выводом.
источник