Tengo un problema con los colores en mi emulador de terminal. Lo estoy usando LXTerminal
como emulador de terminal y LXDE
como entorno de escritorio.
Se supone que el siguiente comando imprime texto rojo sobre fondo gris:
printf "\n\033[1;31;40m"hello"\033[00m\n\n"
Pero eso no funciona. Falta el fondo gris (el texto rojo está bien). En mi máquina más antigua ( Gnome/Gnome Terminal
) todo funciona bien
Intenté instalar varios otros emuladores de terminal, pero el problema persiste. Ni siquiera estoy seguro de si este problema está relacionado con el emulador de terminal o con otra cosa. En la Consola (CTRL+ALT+F1) el color gris de fondo no funciona en ninguna de las máquinas)
Este problema se limita únicamente al fondo gris. Todos los demás colores funcionan bien, por ejemplo, el siguiente imprime texto rojo sobre fondo verde.
printf "\n\033[1;31;42m"hello"\033[00m\n\n"
Apreciaría cualquier ayuda. Ni siquiera sé por dónde empezar a solucionar problemas.
Respuesta1
Hay ocho colores ANSI estándar, compatibles con todos los emuladores de terminal. La mayoría de los emuladores de terminales también tienen ocho variantes brillantes de los colores ANSI estándar.
Sin embargo, los valores de color reales a los que se asignan los códigos de escape no están estandarizados y, de hecho, a menudo varían ligeramente entre los emuladores de terminal. Entonces, si imprime printf "\e[31;47mTest\n"
texto rojo sobre un fondo blanco, los tonos reales de rojo y blanco que obtenga pueden ser diferentes según el emulador de terminal que utilice.
Eso explica en parte el problema: los valores de color no son estándar y LXTerminal
pueden tener diferentes valores predeterminados para su paleta de colores a los que no está acostumbrado. Si miras a tu alrededor en la configuración, generalmente puedes configurar el esquema de color como quieras.
El otro problema al que se enfrenta es que lo que realmente hace el atributo negrita tampoco está estandarizado. Hay tres posibilidades: puede hacer que la fuente esté en negrita, puede hacer que el color de primer plano sea más brillante o puede hacer que el color de primer plano sea más brillante y que la fuente esté en negrita.
Nuevamente, el comportamiento predeterminado aquí varía entre los emuladores de terminal y, por lo general, puedes cambiarlo si encuentras la configuración correcta. Busque algo que mencione "negrita" o "brillante".
Si desea utilizar un color brillante, puede utilizar los llamados códigos de escape de color de aixterm en lugar de negrita. Estos no son estándar, pero son compatibles con todos los emuladores de terminal modernos que conozco. A diferencia de las negritas, siempre usan colores brillantes y además se pueden usar para mostrar colores de fondo brillantes.
Entonces, por ejemplo, si quisiera imprimir texto en rojo brillante sobre un fondo blanco brillante, haría esto: printf "\e[91;107mTest\n"
.
Como referencia, aquí hay una tabla de todos los códigos de escape de colores:
| ANSI | ANSI | ANSI | | Aixterm | Aixterm
| Color | FG Code | BG Code | Bright Color | FG Code | BG Code
+---------+---------+-------- +----------------+---------+--------
| Black | 30 | 40 | Bright Black | 90 | 100
| Red | 31 | 41 | Bright Red | 91 | 101
| Green | 32 | 42 | Bright Green | 92 | 102
| Yellow | 33 | 43 | Bright Yellow | 93 | 103
| Blue | 34 | 44 | Bright Blue | 94 | 104
| Magenta | 35 | 45 | Bright Magenta | 95 | 105
| Cyan | 36 | 46 | Bright Cyan | 96 | 106
| White | 37 | 47 | Bright White | 97 | 107
Respuesta2
El 1
atributo al principio 1;31;40
activa el modo "negrita" (también conocido como "brillante"), pero algunos terminales solo aplican esto al color de primer plano. No tengo idea de por qué (y cambiar la variable $TERM no hace ninguna diferencia), ya que admiten 16 colores en primer plano. 1 0 (de 40
: 4 = fondo, 0 = el color) es en realidad negro, pero "negro brillante" es gris. Aquí hay dos soluciones:
El color 7 (blanco) probablemente resultará gris, no blanco (para un blanco verdadero, necesitas "blanco brillante", lo que significa que el fondo que en realidad no puedes tener es blanco).
Deberías poder usar el terminal gnome en LXDE si lo deseas. Simplemente instálelo y comience con
gnome-terminal
(creo que ese es el nombre del comando). Luego tendrás que configurar cualquier lanzador para usarlo en lugar del lx-terminal.
1 Esta es mi suposición: observe que configurar negrita aplica brillo al color de primer planoyañade un énfasis audaz. Por lo tanto, no puedes usar un color de primer plano brillante sin aplicar también negrita. Presumiblemente, cuando los terminales monocromáticos eran comunes, simplemente poner negrita para enfatizar, por ejemplo: \\033[1mBlah blah\\033[0m
era común, y de hecho esto seguirá funcionando, pero también hará que el color de primer plano sea brillante. Si consideramos que no es deseable que esto también ilumine el fondo (porque se supone que debe estar en negrita), entonces nos aseguraríamos de que la implementación no hiciera eso. Oh bien.
Respuesta3
Aquí tienes un truco que puedes usar con algunos emuladores de terminal. Le brindará colores de fondo brillantes utilizando el atributo de video inverso (7) para seleccionar un color de primer plano brillante y luego intercambiarlo con el color de fondo.
echo -e "\e[1;32;7mText on a bright green background"
El problema es que aunque ahora puedes tener 16 colores de fondo, la limitación de 8 colores ahora se aplica al primer plano/texto. Y para confundir aún más las cosas, mientras el atributo de video inverso está activo, debes configurar el color del texto usando los códigos de atributo para los colores de fondo.
Respuesta4
En 47=background white
lugar de, 40=background black
obtienes el blanco sin negrita como fondo.
]# printf "\033[0;30;47m"hello"\033[00m\n"
hello (black on grey)
]# printf "\033[1;30;47m"hello"\033[00m\n"
hello (darkgrey on grey)
]# printf "\033[1;37;47m"hello"\033[00m\n"
hello (white on grey)
]# printf "\033[0;37;47m"hello"\033[00m\n"
hello (INVISIBLE grey on grey)
El negro en negrita da como resultado gris oscuro, de forma predeterminada. El blanco normal es en realidad gris, porque el blanco intenso es blanco.
Este bucle imprime dos columnas con todas las combinaciones de color sobre negro y blanco sobre color.
for ((i=30; i<=47; i++))
do
echo -en "\e[${i}mHello\e[0m";
echo -e "\e[1;${i}mHello\e[0m";
done
Comienza con negro invisible y gris oscuro sobre negro, pero las otras 17 líneas se ven bien y muestran toda la paleta de colores de la consola.
(38 y 39 deberían omitirse, pero para simplificar solo voy del 30 al 47)
Aceptado A. mencionaochoColores y falta de estándares.
Los seis colores 31-36 (del rojo al cian) están bien definidos. Negro (30) y Blanco (37) también, pero menos sus variantes en negrita, especialmente como fondo (40 y 47).
Me acabo de dar cuenta: en xterm el texto blanco normal es visible sobre un fondo gris, pero en la consola de Linux no. (última línea, con i=47) (hasta hace 30 minutos el script se detenía en 46, porque no quería variantes ilegibles)
En ambos lugares, cuando se selecciona con el mouse, se adapta inteligentemente y permanece legible cuando se invierte.