Respuesta corta: no use códigos de color "compuestos" como 3[49;36m
, use instrucciones de color separadas como 3[0;42m3[0;36m
en su lugar.
La diferencia se puede ver bien comparando la salida de esos dos comandos:
echo -e "3[0;42;36m\xe2\x96\x883[0;49;36m\xe2\x96\x88"
echo -e "3[0;42m3[0;36m\xe2\x96\x883[0;49;36m\xe2\x96\x88"
(tenga en cuenta que mi versión de bash no pudo procesar \u2588
, por lo que tuve que recurrir a la variante hexadecimal \xe2\x96\x88
).
Sugerencia para código futuro:
Cree un archivo (por ejemplo, en ~/.bash_color_definitions
) con el siguiente contenido:
# Setup some colors to use later in interactive shell or scripts
# Color reset:
export COLOR_RESET='3[0m' # reset color
# foreground colors
export FG_WHITE='3[1;37m'
export FG_BLACK='3[0;30m'
export FG_BLUE='3[0;34m'
export FG_LIGHT_BLUE='3[1;34m'
export FG_GREEN='3[0;32m'
export FG_LIGHT_GREEN='3[1;32m'
export FG_CYAN='3[0;36m'
export FG_LIGHT_CYAN='3[1;36m'
export FG_RED='3[0;31m'
export FG_LIGHT_RED='3[1;31m'
export FG_PURPLE='3[0;35m'
export FG_LIGHT_PURPLE='3[1;35m'
export FG_BROWN='3[0;33m'
export FG_YELLOW='3[1;33m'
export FG_GRAY='3[1;30m'
export FG_LIGHT_GRAY='3[0;37m'
# background colors
export BG_WHITE='3[1;47m'
export BG_BLACK='3[0;40m'
export BG_BLUE='3[0;44m'
export BG_LIGHT_BLUE='3[1;44m'
export BG_GREEN='3[0;42m'
export BG_LIGHT_GREEN='3[1;42m'
export BG_CYAN='3[0;46m'
export BG_LIGHT_CYAN='3[1;46m'
export BG_RED='3[0;41m'
export BG_LIGHT_RED='3[1;41m'
export BG_PURPLE='3[0;45m'
export BG_LIGHT_PURPLE='3[1;45m'
export BG_BROWN='3[0;43m'
export BG_YELLOW='3[1;43m'
export BG_GRAY='3[1;40m'
export BG_LIGHT_GRAY='3[0;47m'
Y obténgalo en cada inicio de bash poniendo source ~/.bash_color_definitions
en su .bashrc
o .bash_profile
. Entonces comienza a producir un código más legible como este:
echo -e "$BG_BLACK$FG_CYAN\xe2\x96\x88$BG_GRAY$FG_CYAN\xe2\x96\x88$COLOR_RESET"
EDIT:
Resulta que, el código de mi respuesta realmente restablece el fondo (como Erik señaló en los comentarios).
Después de un poco de prueba, parece que la Terminal Mac "mezcla" los colores de primer plano / fondo un poco diferentes cuando intenta usar el código de color 49
, es decir, el "color de fondo predeterminado".
iTerm.app, por ejemplo, no se comporta de esta manera, por lo que puede cambiar fácilmente los terminales, si lo desea.
Sin embargo, una solución válida es especificar completamente el color de fondo (es decir, no solo use 49;36m
, use 47;36m
si su fondo es blanco). O mejor usa las especificaciones de color xterm-256color
; eso es 3[38;5;___m
para el primer plano y 3[48;5;___m
para los colores de fondo (reemplazando el guión bajo con un número en 0-255). Al menos en mi computadora, esto produce colores consistentes:
echo -e "3[48;5;256m3[38;5;6m\xe2\x96\x883[40;36m3[38;5;6m\xe2\x96\x883[0m"
Si desea comprobar qué color de fondo ANSI xterm-256 coincide mejor con su color de fondo real, puede usar este script (versión modificada del encontrado aquí ):
#!/bin/bash
for fgbg in 38 48 ; do #Foreground/Background
for color in {0..256} ; do #Colors
#Display the color
echo -e "3[${fgbg};5;${color}m ${color}\t3[0m"
done
echo #New line
done
exit 0