¿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:
- La salida estándar debe ser un dispositivo terminal, según lo determinado por
isatty()
.
- El programa debe poder buscar el registro para el tipo de terminal en la base de datos termcap / terminfo.
- Por lo tanto, debe haber un tipo de terminal para buscar. La
TERM
variable de entorno debe existir y su valor debe coincidir con un registro de base de datos.
- Por lo tanto, debe haber una base de datos terminfo / termcap. En algunas implementaciones del subsistema, la ubicación de la base de datos termcap se puede especificar utilizando una
TERMCAP
variable de entorno. Entonces, en algunas implementaciones hay una segunda variable de entorno.
- El registro termcap / terminfo debe indicar que el tipo de terminal admite colores. Hay un
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.
- El registro termcap / terminfo debe proporcionar el camino para que el programa cambie los colores. Hay
set_a_foreground
y set_a_background
campos en terminfo.
Es un poco más complejo que solo verificar isatty()
. Se complica aún más por varias cosas:
- Algunas aplicaciones agregan opciones de línea de comandos o indicadores de configuración que anulan la
isatty()
verificación, de modo que el programa siempre o nunca asume que tiene un terminal (colorable) como salida. Por ejemplo:
- GNU
ls
tiene la --color
opción de línea de comandos.
- BSD
ls
analiza las variables de entorno CLICOLOR
(su ausencia significa que nunca ) y CLICOLOR_FORCE
(su presencia significa siempre ), y también presenta la -G
opción de línea de comandos.
- Algunas aplicaciones no usan termcap / terminfo y tienen respuestas cableadas al valor de
TERM
.
- No todos los terminales usan secuencias ECMA-48 o ISO 8613-6 SGR, que se denominan "secuencias de escape ANSI", para cambiar los colores. El mecanismo termcap / terminfo está diseñado para aislar las aplicaciones del conocimiento directo de las secuencias de control exactas. (Además, hay un argumento para argumentar que nadie usa las secuencias SGR ISO 8613-6, porque todos están de acuerdo con el error de usar punto y coma como delimitador para las secuencias SGR de color RGB. El estándar en realidad especifica dos puntos).
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 la TERM
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 cableado dumb
:
En t
debe_colorizar (vacío)
{
char const * t = getenv ("TÉRMINO");
return t && strcmp (t, "tonto")! = 0;
}
Entonces, incluso si TERM
es así xterm-mono
, GNU grep
decidirá emitir colores, aunque otros programas como vim
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 cableado dumb
:
En t
debe_colorizar (vacío)
{
char const * t = getenv ("TÉRMINO");
regreso ! (t && strcmp (t, "tonto") == 0);
}
grep
Los problemas de GNU con el color
grep
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 . GNU grep
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