Hola, hemos encontrado la respuesta a lo que necesitas, continúa leyendo y la hallarás un poco más abajo.
Solución:
Nota
Es posible que no pueda colorear los cmd prompt
, pero debería funcionar en muchos terminales Unix (o similares a Unix).
Además, tenga en cuenta que algunos terminales simplemente no admitirán algunas (si las hay) secuencias de escape ANSI y, especialmente, colores de 24 bits.
Uso
Consulte la sección Maldiciones en la parte inferior para obtener la mejor solución. Para una solución personal o fácil (aunque no como solución multiplataforma), consulte la Secuencias de escape ANSI sección.
TL; DR
-
Java:
System.out.println ((char) 27 + "[31m" + "ERROR MESSAGE IN RED");
-
python:
print(chr(27) + "[31m" + "ERROR MESSAGE IN RED")
- bash or zsh:
printf 'x1b[31mERROR MESSAGE IN RED'
- this may also work for Os X:
printf 'e[31mERROR MESSAGE IN RED'
- this may also work for Os X:
- sh:
printf '
CTRL+V,CTRL+[[31mERROR MESSAGE IN RED'
- ie, press CTRL+V and then CTRL+[ in order to get a “raw” ESC character when escape interpretation is not available
- If done correctly, you should see a
^[
. Although it looks like two characters, it is really just one, the ESC character. - You can also press CTRL+V,CTRL+[ in vim in any of the programming or sripting langauges because that uses a literal ESC character
- Also, you can replace Ctrl+[ with ESC … eg, you can use CTRL+V,ESC, but I find the former easier, since I am already pressing CTRL and since [ is less out of the way.
ANSI Escape Sequences
Background on Escape Sequences
While it is not the best way to do it, the easiest way to do this in a programming or scripting language is to use escape sequences. From that link:
An escape sequence is a series of characters used to change the state of computers and their attached peripheral devices. These are also known as control sequences, reflecting their use in device control.
Backgound on ANSI Escape Sequences
However, it gets even easier than that in video text terminals, as these terminals use ANSI escape sequences. From that link:
ANSI escape sequences are a standard for in-band signaling to control the cursor location, color, and other options on video text terminals. Certain sequences of bytes, most starting with Esc and ‘[‘, are embedded into the text, which the terminal looks for and interprets as commands, not as character codes.
How to Use ANSI Escape Sequences
Generally
- Escape sequences begin with an escape character; for ANSI escape sequences, the sequence always begins with ESC (ASCII:
27
/ hex:0x1B
). - For a list of what you can do, refer to the ANSI Escape Sequence List on Wikipedia
In Programming Languages
Some programming langauges (like Java) will not interpret e
or x1b
as the ESC character. However, we know that the ASCII character 27
is the ESC character, so we can simply typecast 27
to a char
and use that to begin the escape sequence.
Here are some ways to do it in common programming languages:
-
Java
System.out.println((char)27 + "[33mYELLOW");
-
Python 3
print(chr(27) + "[34mBLUE");
print("x1b[35mMAGENTA");
- Note that
x1b
is interpretted correctly in python
- Note that
-
Node JS
- The following will NOT color output in JavaScript in the Web Console
console.log(String.fromCharCode(27) + "[36mCYAN");
console.log("x1b[30;47mBLACK_ON_WHITE");
- Note that
x1b
also works in node
- Note that
In Shell Prompt OR Scripts
If you are working with bash or zsh, it is quite easy to color the output (in most terminals). In Linux, Os X, and in some Window’s terminals, you can check to see if your terminal supports color by doing both of the following:
printf 'e[31mRED'
printf 'x1b[31mRED'
If you see color for both, then that’s great! If you see color for only one, then use that sequence. If you do not see color for either of them, then double check to make sure you typed everything correctly and that you are in bash or zsh; if you still do not see any color, then your terminal probably does not support ANSI escape sequences.
If I recall correctly, linux terminals tend to support both e
and x1b
escape sequences, while os x terminals only tend to support e
, but I may be wrong. Nonetheless, if you see something like the following image, then you’re all set! (Note that I am using the shell, zsh, and it is coloring my prompt string; also, I am using urxvt as my terminal in linux.)
“How does this work?” you might ask. Bascially, printf
is interpretting the sequence of characters that follows (everything inside of the single-quotes). When printf
encounters e
or x1b
, it will convert these characters to the ESC character (ASCII: 27). That’s just what we want. Now, printf
sends ESC31m
, and since there is an ESC followed by a valid ANSI escape sequence, we should get colored output (so long as it is supported by the terminal).
You can also use echo -e 'e[32mGREEN'
(for example), to color output. Note that the -e
flag for echo
“[enables] interpretación de los escapes de barra invertida “ y debe usarse si quieres echo
para interpretar adecuadamente la secuencia de escape.
Más sobre las secuencias de escape ANSI
Las secuencias de escape ANSI pueden hacer más que solo salida de color, pero comencemos con eso y veamos exactamente cómo funciona el color; luego, veremos cómo manipular el cursor; finalmente, echaremos un vistazo y veremos cómo usar el color de 8 bits y también el color de 24 bits (aunque solo tiene un soporte tenue).
En Wikipedia, se refieren a ESC[ as CSI
, so I will do the same.
Color
To color output using ANSI escapes, use the following:
CSI
n
m
CSI
: escape character—^[[
or ESC[n
: a number—one of the following:30
–37
,39
: foreground40
–47
,49
: background
m
: a literal ASCIIm
—terminates the escape sequence
I will use bash or zsh to demonstrate all of the possible color combinations. Plop the following in bash or zsh to see for yourself (You may need to replace e
with x1b
):
for fg in 30..37 39; do for bg in 40..47 49; do printf "e[$fg;$bgm~TEST~"; done; printf "n"; done;
Result:
Quick Reference (Color)
+~~~~~~+~~~~~~+~~~~~~~~~~~+
| fg | bg | color |
+~~~~~~+~~~~~~+~~~~~~~~~~~+
| 30 | 40 | black |
| 31 | 41 | red |
| 32 | 42 | green |
| 33 | 43 | yellow |
| 34 | 44 | blue |
| 35 | 45 | magenta |
| 36 | 46 | cyan |
| 37 | 47 | white |
| 39 | 49 | default |
+~~~~~~+~~~~~~+~~~~~~~~~~~+
Select Graphic Rendition (SGR)
SGR just allows you to change the text. Many of these do not work in certain terminals, so use these sparingly in production-level projects. However, they can be useful for making program output more readable or helping you distinguish between different types of output.
Color actually falls under SGR, so the syntax is the same:
CSI
n
m
CSI
: escape character—^[[
or ESC[n
: a number—one of the following:0
: reset1
–9
: turns on various text effects21
–29
: turns off various text effects (less supported than1
–9
)30
–37
,39
: foreground color40
–47
,49
: background color38
: 8- or 24-bit foreground color (see 8/24-bit Color below)48
: 8- or 24-bit background color (see 8/24-bit Color below)
m
: a literal ASCIIm
—terminates the escape sequence
Although there is only tenuous support for faint (2), italic (3), underline (4), blinking (5,6), reverse video (7), conceal (8), and crossed out (9), some (but rarely all) tend to work on linux and os x terminals.
It’s also worthwhile to note that you can separate any of the above attributes with a semi-colon. For example printf 'e[34;47;1;3mCRAZY TEXTn'
will show CRAZY TEXT
with a blue foreground
on a white background
, and it will be bold
and italic
.
Eg:
Plop the following in your bash or zsh shell to see all of the text effects you can do. (You may need to replace e
with x1b
.)
for i in 1..9; do printf "e[$im~TEST~e[0m "; done
Result:
You can see that my terminal supports all of the text effects except for faint (2), conceal (8) and cross out (9).
Quick Reference (SGR Attributes 0-9)
+~~~~~+~~~~~~~~~~~~~~~~~~+
| n | effect |
+~~~~~+~~~~~~~~~~~~~~~~~~+
| 0 | reset |
| 1 | bold |
| 2 | faint* |
| 3 | italic** |
| 4 | underline |
| 5 | slow blink |
| 6 | rapid blink* |
| 7 | inverse |
| 8 | conceal* |
| 9 | strikethrough* |
+~~~~~+~~~~~~~~~~~~~~~~~~+
* not widely supported
** not widely supported and sometimes treated as inverse
8-bit Color
While most terminals support this, it is less supported than 0-7
,9
colors.
Syntax:
CSI
38;5;
n
m
CSI
: escape character—^[[
or ESC[38;5;
: literal string that denotes use of 8-bit colors for foregroundn
: a number—one of the following:0
–255
If you want to preview all of the colors in your terminal in a nice way, I have a nice script on gist.github.com.
It looks like this:
If you want to change the background using 8-bit colors, just replace the 38
with a 48
:
CSI
48;5;
n
m
CSI
: escape character—^[[
or ESC[48;5;
: literal string that denotes use of 8-bit colors for backgroundn
: a number—one of the following:0
–255
24-bit Color
Also known as true color, 24-bit color provides some really cool functionality. Support for this is definitely growing (as far as I know it works in most modern terminals except urxvt, my terminal [insert angry emoji]).
El color de 24 bits es realmente compatible con vim (consulte la wiki de vim para ver cómo habilitar los colores de 24 bits). Es realmente genial porque se basa en el esquema de colores definido para gvim; por ejemplo, usa el fg / bg de highlight guibg=#______ guifg=#______
para los colores de 24 bits! Neato, ¿eh?
Así es como funciona el color de 24 bits:
CSI
38;2;
r
;
g
;
b
m
CSI
: Personaje de escape-^[[
o ESC[[38;2;
: cadena literal que denota el uso de colores de 24 bits para el primer planor
,g
,b
: números: cada uno debe ser0
–255
Probar sólo algunos de los muchos colores que puedes tener(2^8)^3
o 2^24
o 16777216
posibilidades, creo), puede usar esto en bash o zsh:
for r in 0 127 255; do for g in 0 127 255; do for b in 0 127 255; do printf "e[38;2;$r;$g;$bm($r,$g,$b)e[0m "; done; printf "n"; done; done;
Resultado (esto está en gnomo-terminal ya que urxvt NO SOPORTA color de 24 bits … júntelo, mantenedor de urxvt … de verdad):
Si quieres colores de 24 bits para el fondo … ¡lo has adivinado! Tu solo reemplazas 38
con 48
:
CSI
48;2;
r
;
g
;
b
m
CSI
: Personaje de escape-^[[
o ESC[[48;2;
: cadena literal que denota el uso de colores de 24 bits para el fondor
,g
,b
: números: cada uno debe ser0
–255
Insertar secuencias de escape sin procesar
Algunas veces e
y x1b
no trabajará. Por ejemplo, en el sh shell, a veces ninguno funciona (aunque lo hace en mi sistema ahora, No creo que solía hacerlo).
Para evitar esto, puede usar CONTROL+V,CONTROL+[[ o CONTROLV,ESC
Esto insertará un “crudo” ESC carácter (ASCII: 27). Se verá así ^[
, pero no te preocupes; es sólo un carácter, no dos.
P.ej:
Maldiciones
Consulte la página Curses (Biblioteca de programación) para obtener una referencia completa sobre las maldiciones. Cabe señalar que curses solo funciona en sistemas operativos Unix y similares a Unix.
En marcha con maldiciones
No entraré en demasiados detalles, ya que los motores de búsqueda pueden revelar enlaces a sitios web que pueden explicar esto mucho mejor que yo, pero lo discutiré brevemente aquí y daré un ejemplo.
¿Por qué utilizar maldiciones sobre escapes ANSI?
Si lees el texto anterior, es posible que recuerdes que e
o x1b
a veces trabajará con printf
. Bueno, a veces e
y x1b
no funcionará en absoluto (esto no es estándar y nunca he trabajado con un terminal como este, pero es posible). Más importante aún, secuencias de escape más complejas (piense Hogar y otras claves de varios caracteres) son difíciles de admitir para cada terminal (a menos que esté dispuesto a dedicar mucho tiempo y esfuerzo a analizar terminfo y termcap y averiguar cómo manejar cada terminal).
Maldiciones resuelve este problema. Básicamente, puede comprender qué capacidades tiene un terminal, utilizando estos métodos (como se describe en el artículo de wikipedia vinculado anteriormente):
La mayoría de las implementaciones de curses utilizan una base de datos que puede describir las capacidades de miles de terminales diferentes. Hay algunas implementaciones, como PDCurses, que utilizan controladores de dispositivos especializados en lugar de una base de datos de terminal. La mayoría de las implementaciones usan terminfo; algunos usan termcap. Curses tiene la ventaja de la portabilidad hacia atrás a terminales de celda de carácter y la simplicidad. Para una aplicación que no requiere gráficos en mapa de bits o múltiples fuentes, una implementación de interfaz que usa curses generalmente será mucho más simple y rápida que una que usa un kit de herramientas X.
La mayoría de las veces, las maldiciones sondearán terminfo y luego podrán entender cómo manipular el cursor y los atributos del texto. Luego, usted, el programador, usa la API proporcionada por curses para manipular el cursor o cambiar el color del texto u otros atributos si desea la funcionalidad que busca.
Ejemplo con Python
Creo que Python es realmente fácil de usar, pero si desea usar curses en un lenguaje de programación diferente, simplemente búsquelo en duckduckgo o en cualquier otro motor de búsqueda. 🙂 Aquí hay un ejemplo rápido en Python 3:
import curses
def main(stdscr):
# allow curses to use default foreground/background (39/49)
curses.use_default_colors()
# Clear screen
stdscr.clear()
curses.init_pair(1, curses.COLOR_RED, -1)
curses.init_pair(2, curses.COLOR_GREEN, -1)
stdscr.addstr("ERROR: I like tacos, but I don't have any.n", curses.color_pair(1))
stdscr.addstr("SUCCESS: I found some tacos.n", curses.color_pair(2))
stdscr.refresh() # make sure screen is refreshed
stdscr.getkey() # wait for user to press key
if __name__ == '__main__':
curses.wrapper(main)
resultado:
Podrías pensar que esta es una forma mucho más redonda de hacer las cosas, pero en realidad es mucho más multiplataforma (realmente cross-terminal … al menos en el mundo de las plataformas Unix y Unix). Para los colores, no es bastante tan importante, pero cuando se trata de admitir otras secuencias de escape de múltiples secuencias (como Hogar, Fin, Página arriba, Página abajo, etc.), entonces las maldiciones se vuelven aún más importantes.
Ejemplo con Tput
tput
es una utilidad de línea de comando para manipular el cursor y el textotput
viene con elcurses
paquete. Si desea usar aplicaciones de terminal cruzado (ish) en el terminal, debe usar tput, ya que analiza terminfo o lo que sea necesario y usa un conjunto de comandos estandarizados (como curses) y devuelve la secuencia de escape correcta.- ejemplo:
echo "$(tput setaf 1)$(tput bold)ERROR:$(tput sgr0)$(tput setaf 1) My tacos have gone missing"
echo "$(tput setaf 2)$(tput bold)SUCCESS:$(tput sgr0)$(tput setaf 2) Oh good! I found my tacos!"
Resultado:
Más información sobre Tput
- ver: http://linuxcommand.org/lc3_adv_tput.php para ver cómo funciona tput
- consulte: http://invisible-island.net/ncurses/man/terminfo.5.html para obtener una lista de comandos que puede utilizar
Esto me ha funcionado:
System.out.println((char)27 + "[31mThis text would show up red" + (char)27 + "[0m");
Necesita la terminación “[37m”paradevolverelcolorablanco(oloqueseaqueestéusando)Sinolohacepuedehacerquetodoloquesiguesea”rojo”[37m”toreturnthecolortowhite(orwhateveryouwereusing)Ifyoudon’titmaymakeeverythingthatfollows”red”
No, pero hay API de terceros que pueden manejarlo.
http://www.javaworld.com/javaworld/javaqa/2002-12/02-qa-1220-console.html
Editar: por supuesto que hay artículos más nuevos que el que publiqué, aunque la información sigue siendo viable.
Comentarios y calificaciones
Si piensas que te ha resultado provechoso este artículo, nos gustaría que lo compartas con otros desarrolladores de este modo contrubuyes a extender nuestra información.