escape color codes ansi-escape

ansi escape - codes - Bash de secuencia RGB específica de color ANSI



ansi color codes (4)

Sé que en los terminales bash una forma confiable de cambiar de color es usar secuencias de escape ANSI. Por ejemplo:

echo -e "/033[0;31mbrown text/033[0;00m"

debe dar salida

brown text (in brown)

¿Hay alguna forma de generar color utilizando un conjunto RGB específico con ANSI? Di que quiero rojo brillante:

echo -e "**/033[255:0:0m**red text/033[0;00m"

¿Existe este tipo de cosas?

Sólo quiero usar bash estándar.


Actualmente, las secuencias de escape de color verdadero (/ e [38; 2; R; G; Bm) están soportadas por ciertos emuladores de terminal, incluidos gnome-terminal (con vte> = 0.36), konsole y st [suckless].

La característica no es compatible con algunos otros, por ejemplo, pterm [putty], terminología [enlightenment], urxvt.

xterm está a mitad de camino: reconoce las secuencias de escape, pero redondea cada color al más cercano en la paleta de 256 colores.


Ambas respuestas aquí no mencionan el soporte Truecolor ANSI para el color 8bpc. Esto obtendrá el color RGB que el OP solicitó originalmente.

En lugar de ;5 , use ;2 , y especifique los valores R , G y B (0-255) en los siguientes tres segmentos de control.

/x1b[38;2;40;177;249m

Para probar si su terminal soporta Truecolor :

printf "/x1b[38;2;40;177;249mTRUECOLOR/x1b[0m/n"

En mi máquina, XTerm generó felizmente el color correcto; aunque, los terminales que se modelan después de los terminales que preceden al color RGB moderno generalmente no son compatibles con truecolor; asegúrese de conocer su objetivo antes de usar esta variante particular del código de escape.

También me gustaría señalar el 38 y el ;5 / ;2 - Blue Ice mentioned que 38 rutas y luego 5 cambia el color. Eso es un poco incorrecto.

38 es el código de color de primer plano extendido xterm-256; 30 códigos 30 37 son simplemente códigos de primer plano de 16 colores (con un brillo controlado por el código de escape 1 en algunos sistemas y los códigos de ''brillo'' no estándar de 90 97 que se pueden sostener) que son compatibles con todos los terminales de color compatibles con vt100 / xterm .

El ;2 y ;5 indican el formato del color, y finalmente le dice al terminal cuántas secuencias más debe extraer:; ;5 especificando un formato de 8 bits (como se mencionó en Blue Ice) que requiere solo 1 segmento de control más, y ;2 especificando un Formato RGB completo de 24 bits que requiere 3 segmentos de control.

Estos modos extendidos están técnicamente "sin documentar" y están completamente definidos por la implementación. Por lo que sé y puedo investigar, no están regidos por el comité ANSI.

Para los así inclinados, los 5; El formato (256 colores) comienza con los 16 colores originales (tanto oscuro / claro, 30-37 y 90-97) como colores 0-15.

Los 216 colores (16-231) que siguen son formados por un valor RGB de 3bpc compensado por 16, empaquetados en un solo valor.

Los últimos 24 colores (232-256) son en escala de grises a partir de un tono ligeramente más claro que el negro, que va hasta un tono ligeramente más oscuro que el blanco. Algunos emuladores interpretan estos pasos como incrementos lineales de ( 256 / 24 ) en los tres canales, aunque he encontrado algunos emuladores que parecen definir explícitamente estos valores.

Aquí hay una función de Javascript que realiza dicha conversión, teniendo en cuenta todos los grises.

function rgbToAnsi256(r, g, b) { // we use the extended greyscale palette here, with the exception of // black and white. normal palette only has 4 greyscale shades. if (r === g && g === b) { if (r < 8) { return 16; } if (r > 248) { return 231; } return Math.round(((r - 8) / 247) * 24) + 232; } var ansi = 16 + (36 * Math.round(r / 255 * 5)) + (6 * Math.round(g / 255 * 5)) + Math.round(b / 255 * 5); return ansi; }

Entonces, de alguna manera, puede calculate 256 colores ANSI a partir de los valores RGB iniciales, reduciéndolos de 8 a 3 bits para formar un valor 256 codificado en el caso de que desee hacerlo mediante programación en terminales que no admiten Truecolor.


Esto existe, pero en lugar de los 16777216 (256 ^ 3) colores que buscaba el OP, hay 216 (6 ^ 3) colores distribuidos por igual, en un conjunto más amplio de 256 colores. Ejemplo:

echo -e "/033[38;5;208mpeach/033[0;00m"

Esto dará como resultado un texto agradable de color melocotón.

Desarmando este comando: / 033 [38; 5; 208m

El / 033 es el código de escape. El [38; dirige el comando al primer plano . Si desea cambiar el color de fondo, use [48; en lugar. El 5; Es solo una parte de la secuencia que cambia de color. Y la parte más importante, 208m , selecciona el color real.

Hay 3 conjuntos de colores que se pueden encontrar en la secuencia de 256 colores para este escape. El primer conjunto es el conjunto de colores "caramelo" básico, o valores 0-15. Luego hay un cubo de colores distribuidos, desde 16-231. Por último, hay un detallado conjunto de escala de grises de 232-255.

Puede encontrar una tabla con todos estos valores aquí: http://bitmote.com/index.php?post/2012/11/19/Using-ANSI-Color-Codes-to-Colorize-Your-Bash-Prompt-on-Linux#256%20(8-bit)%20Colors


No no hay

Y para aclarar, técnicamente no son "secuencias de escape ANSI" sino códigos de control VT100 (que se definieron mucho antes de que existieran terminales y términos gráficos como "RGB").