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;36m
es 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
, tput
buscará 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 setaf
có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 tput
solo 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\]"
\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.