Cuando ejecuto un comando desde un terminal que imprime resultados en color (como ls
o gcc
), se imprime el resultado en color. Según tengo entendido, el proceso en realidad está generando códigos de escape ANSI , y el terminal formatea el color.
Sin embargo, si ejecuto el mismo comando mediante otro proceso (digamos una aplicación C personalizada) y redirijo la salida a la propia salida de la aplicación, estos colores no persisten.
¿Cómo decide un programa si generar o no texto con formato de color? ¿Hay alguna variable de entorno?
Si. Es la
TERM
variable de entorno. Esto se debe a que hay varias cosas que se usan como parte del proceso de decisión.Es difícil generalizar aquí, porque no todos los programas están de acuerdo en un solo diagrama de flujo de decisión. De hecho
grep
, GNU , mencionado en la respuesta de M. Kitt, es un buen ejemplo de un caso atípico que utiliza un proceso de decisión algo inusual con resultados inesperados. En términos muy generales, por lo tanto:isatty()
.TERM
variable de entorno debe existir y su valor debe coincidir con un registro de base de datos.TERMCAP
variable de entorno. Entonces, en algunas implementaciones hay una segunda variable de entorno.max_colors
campo en terminfo. No está configurado para tipos de terminales que en realidad no tienen capacidades de color. De hecho, existe una convención terminfo de que para cada tipo de terminal que se puede colorear hay otro registro con el nombre-m
o que se-mono
agrega al mismo que no indica capacidad de color.set_a_foreground
yset_a_background
campos en terminfo.Es un poco más complejo que solo verificar
isatty()
. Se complica aún más por varias cosas:isatty()
verificación, de modo que el programa siempre o nunca asume que tiene un terminal (colorable) como salida. Por ejemplo:ls
tiene la--color
opción de línea de comandos.ls
analiza las variables de entornoCLICOLOR
(su ausencia significa que nunca ) yCLICOLOR_FORCE
(su presencia significa siempre ), y también presenta la-G
opción de línea de comandos.TERM
.Como se mencionó, GNU en
grep
realidad exhibe algunas de estas complejidades adicionales. No consulta termcap / terminfo, cablea las secuencias de control para emitir y cablea una respuesta a laTERM
variable de entorno.El puerto Linux / Unix tiene este código , que permite la coloración solo cuando
TERM
existe la variable de entorno y su valor no coincide con el nombre cableadodumb
:Entonces, incluso si
TERM
es asíxterm-mono
, GNUgrep
decidirá emitir colores, aunque otros programas comovim
no lo hagan.El puerto Win32 tiene este código , que permite la coloración cuando la
TERM
variable de entorno no existe o cuando existe y su valor no coincide con el nombre cableadodumb
:grep
Los problemas de GNU con el colorgrep
La coloración de GNU es realmente notoria. Debido a que en realidad no hace un trabajo adecuado al construir la salida del terminal, sino que solo culpa a algunas secuencias de control cableadas en varios puntos de su salida con la vana esperanza de que eso sea lo suficientemente bueno, en realidad muestra una salida incorrecta en ciertas circunstancias.Estas circunstancias son donde tiene que colorear algo que está en el margen derecho de la terminal. Los programas que realizan la salida del terminal correctamente deben tener en cuenta los márgenes derechos automáticos. Además de la ligera posibilidad de que el terminal no los tenga (es decir, el
auto_right_margin
campo en terminfo), el comportamiento de los terminales que tienen márgenes derechos automáticos a menudo sigue el precedente DEC VT de la línea pendiente pendiente . GNUgrep
no tiene en cuenta esto, ingenuamente espera un ajuste de línea inmediato , y su salida de color sale mal.La salida en color no es una cosa simple.
Otras lecturas
grep --color
no muestra la salida correcta ". Preguntas frecuentes de xterm . Isla invisiblefuente
$TERM
No explica eso. (Su respuesta es interesante en general, pero no creo que aborde la pregunta ...)El
unbuffer
comando del paquete de espera desacopla la salida del primer programa y la entrada al segundo programa.Lo usarías así:
Lo uso todo el tiempo con ansible y un script ctee casero para poder ver la salida de color en el terminal, mientras dejo el archivo de registro con salida normal (sin color).
fuente