¿Están las secuencias de escape de color terminal definidas en algún lugar para bash?

22

He usado colores de vez en cuando en las secuencias de comandos Bash (principalmente en CentOS), pero para hacer que su uso sea más conveniente, termino redefiniendo las variables a valores de color:

local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"

o también con tput:

bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`

Recorrí el /etc/rc.d/init.ddirectorio pero no encontré nada relacionado con las definiciones de color allí.

¿Existe tal definición ya en su lugar? Si no, los pondría en un archivo, /etc/rc.d/init.dpor ejemplo, y lo incluiría en mis scripts, un poco como con/etc/rc.d/init.d/functions

fduff
fuente
No lo son, porque \e[1;30m, por ejemplo, técnicamente no representa el gris, sino que la ranura de color generalmente se muestra en gris por un terminal. Los emuladores de terminal son libres de cambiar los colores reales de la pantalla y, a menudo, los convierten en una opción configurable por el usuario.
chepner

Respuestas:

36

Hay varios aspectos en juego en lo que estás preguntando.

Primero, bash no define los colores. De hecho, bash no tiene ni idea de que existan colores. Todo lo que sabe es que le dijiste que mostrara los caracteres \033[0;36m. Su emulador de terminal (xterm, gnome-terminal, lo que sea) recibe estos caracteres y entiende "Necesito comenzar a emitir en cian".

Por lo tanto, es su emulador de terminal el que entiende los colores. Su emulador de terminal entiende que \033[0;36mes cian, pero otro emulador de terminal podría usar un conjunto de caracteres completamente diferente para cian (aunque ningún emulador de terminal sensato haría alarde del estándar y haría esto). Este es el motivo tput. Cuando ejecute tput setaf 6, tputbuscará los códigos de escape de su terminal para el color 6 (cian) y generará ese código de escape.
(vea esta pregunta para obtener más información sobre los tput setafcódigos)

Ahora de vuelta a la fiesta. Como habrás notado, cuando me he referido al color cian, he estado usando \033[0;36m, no \[\033[0;36m\]. Faltan los corchetes. El propósito de los corchetes es que cuando se usan códigos de escape (colores) en la solicitud, bash tiene que saber qué caracteres no se imprimen (ancho cero, en realidad no muestran nada). Por lo tanto, incluye caracteres que no se imprimen \[ \]. Si elimina estos caracteres, todo puede parecer que funciona bien al principio, pero comenzará a encontrarse con todo tipo de rarezas cuando su comando exceda el ancho del terminal. Esto se debe a que al escribir, bash debe saber cuándo el comando debe pasar a la siguiente línea. Para hacer esto, calcula el ancho de la solicitud y luego el ancho de cuánto ha escrito.

Otra nota, sobre tput. NoCYAN="\[\033[0;36m\]" es lo mismo que CYAN="$(tput setaf 6)". Como acabamos de comentar, los corchetes son relevantes para bash, y tputsolo generará los códigos de escape del terminal.

Dado que los corchetes generalmente solo son relevantes en la solicitud, si usa colores en la salida de un script o algo así, no debe usarlos. Lo que significa que si va a utilizar colores para más que indicaciones, debe definir múltiples variables. Uno con corchetes para usar en el indicador y otro sin todo lo demás. Aunque podría agregar manualmente los corchetes cada vez que haga referencia a un color en la solicitud.

En resumen, probablemente quieras definir algo como:

local CYAN="$(tput setaf 6)" # OR CYAN="\033[0;36m"
local LIGHT_CYAN="$CYAN$(tput bold)" # OR LIGHT_CYAN="\033[1;36m"
local PROMPT_CYAN="\[$CYAN\]"
local PROMPT_LIGHT_CYAN="\[$LIGHT_CYAN\]"
Patricio
fuente
¿Cómo veo colores al iniciar sesión en un terminal real con Ctrl+ Alt+ F1?
Serge Stroobandt