Kiedy wykonuję polecenie z terminala, który drukuje kolorowe wydruki (takie jak ls
lub gcc
), drukowane są kolorowe wydruki. Z mojego zrozumienia, proces faktycznie generuje kody specjalne ANSI , a terminal formatuje kolor.
Jednak jeśli wykonam to samo polecenie w innym procesie (powiedzmy niestandardową aplikację C) i przekieruję dane wyjściowe na własne dane wyjściowe aplikacji, kolory te nie zostaną zachowane.
W jaki sposób program decyduje, czy wydrukować tekst w formacie kolorowym? Czy jest jakaś zmienna środowiskowa?
Tak. Jest to
TERM
zmienna środowiskowa. Jest tak, ponieważ istnieje kilka rzeczy, które są wykorzystywane w ramach procesu decyzyjnego.Trudno tu uogólnić, ponieważ nie wszystkie programy zgadzają się co do schematu pojedynczej decyzji. W rzeczywistości GNU
grep
, wspomniane w odpowiedzi M. Kitt, jest dobrym przykładem wartości odstającej, która wykorzystuje nieco nietypowy proces decyzyjny z nieoczekiwanymi wynikami. Dlatego bardzo ogólnie:isatty()
.TERM
Zmienna musi istnieć, a jego wartość musi odpowiadać rekord bazy danych.TERMCAP
zmiennej środowiskowej. Tak więc na niektórych implementacjach jest sekunda zmienna środowiskowa.max_colors
terminfo znajduje się pole. Nie jest ustawiony dla typów terminali, które tak naprawdę nie mają możliwości kolorowania. Rzeczywiście, istnieje konwencja terminfo, która dla każdego koloryzowalnego typu terminala zawiera inny rekord z nazwą-m
lub-mono
dołączony do nazwy, który nie określa możliwości kolorystycznych.set_a_foreground
iset_a_background
pola.Jest to nieco bardziej skomplikowane niż tylko sprawdzanie
isatty()
. Wykonany jest dodatkowo skomplikowana przez kilka rzeczy:isatty()
sprawdzenie, tak że program zawsze lub nigdy nie zakłada, że ma (wyjściowy) terminal jako wyjście. Dla przykładów:ls
ma--color
opcję wiersza poleceń.ls
sprawdza zmienne środowiskoweCLICOLOR
(jego brak oznacza nigdy ) iCLICOLOR_FORCE
(jego obecność zawsze oznacza ), a także obsługuje-G
opcję wiersza polecenia.TERM
.Jak wspomniano, GNU
grep
faktycznie wykazuje niektóre z tych dodatkowych złożoności. Nie konsultuje termcap / terminfo, zapisuje sekwencje kontrolne do emisji i zapisuje odpowiedź naTERM
zmienną środowiskową.Jego port Linux / Unix ma ten kod , który umożliwia kolorowanie tylko wtedy, gdy
TERM
istnieje zmienna środowiskowa, a jej wartość nie jest zgodna z nazwą przewodowądumb
:Więc nawet jeśli
TERM
takxterm-mono
, GNUgrep
zdecyduje się na emisję kolorów, nawet jeśli inne programy tegovim
nie zrobią.Jego port Win32 ma ten kod , który umożliwia kolorowanie, gdy
TERM
zmienna środowiskowa nie istnieje lub gdy istnieje, a jej wartość nie jest zgodna z nazwą przewodowądumb
:grep
Problemy GNU z koloremgrep
Kolorystyka GNU jest w rzeczywistości znana. Ponieważ tak naprawdę nie wykonuje właściwej pracy konstruowania danych wyjściowych terminala, a jedynie obwinia w kilku przewodowych sekwencjach sterujących w różnych punktach danych wyjściowych, w próżnej nadziei, że jest to wystarczająco dobre, w rzeczywistości wyświetla nieprawidłowe dane wyjściowe w pewnych okolicznościach.W tych okolicznościach musi koloryzować coś, co znajduje się na prawym marginesie terminalu. Programy, które prawidłowo wykonują wyjście terminala, muszą uwzględniać automatyczne marginesy automatyczne. Oprócz niewielkiej możliwości, że terminal może ich nie mieć (tzn.
auto_right_margin
Pole w terminfo), zachowanie terminali, które mają automatyczne marginesy, często jest zgodne z precedensem DEC VT oczekującego zawijania linii . GNUgrep
nie bierze tego pod uwagę, naiwnie oczekując natychmiastowego zawinięcia linii , a jego kolorowe wyjście nie działa .Kolorowe wydruki nie są prostą sprawą.
Dalsza lektura
grep --color
nie wyświetla prawidłowego wyniku ”. xterm FAQ . Niewidzialna wyspa.źródło
$TERM
nie wyjaśnia tego. (Twoja odpowiedź jest ogólnie interesująca, ale nie sądzę, że odnosi się do pytania ...)unbuffer
Polecenie z oczekiwać Package de-pary wyjście z pierwszego programu i wejście do drugiego programu.Użyłbyś tego w ten sposób:
Używam go cały czas z ansible i homebrewed skryptu ctee, dzięki czemu mogę zobaczyć kolor wyjściowy na terminalu, pozostawiając plik dziennika z normalnym (niekolorowanym) wyjściem.
źródło