¡Da color a tu terminal!

¿Te gustaría escribir y leer textos coloreados en tu terminal? ¿Necesitas que tus programas impriman mensajes de advertencia o error coloreados? ¡Este es tu post!

El texto en la terminal se puede clasificar en función de la paleta de colores que utiliza:

  • ASCII plano: monocromático. Es el texto típico.

  • Colores ANSI: es una paleta de ocho colores. Soportada por casi todas las terminales.

  • Colores de 8 bits: es una paleta de 256 colores. Soportada por la mayoría de las terminales.

  • Color de 24 bits o color verdadero: es una paleta de más de 16 millones de colores. Soportada por pocas terminales (por ejemplo, Konsole o UXterm).

A continuación explicaremos como utilizar las diferentes paletas de colores. Para imprimir textos puedes utilizar el comando printf (no imprime un salto de línea, \n al final) o el comando echo -e (sí imprime un salto de línea al final).

Colores ANSI

A continuación describiremos el esquema general que hay que seguir para imprimir textos coloreados, independientemente de la paleta de colores que se utilice:

"\x1b[1;XYmTEXTO\x1b[0m"

o

"\033[1;XYmTEXTO\033[0m"
  • \x1b[ o \033[. Estos caracteres son obligatorios al principio del código de color. Indican que se va a utilizar un carácter ANSI.

  • 1;. Es opcional. Indica que el color a utilizar es brillante. Elimínalo si quieres un color normal.

  • X. Indica si el color que se va a cambiar es del texto o el del fondo.

X Significado

3

Color del texto

4

Color del fondo

Se pueden combinar:

"\x1b[1;3Y;1;4YmTEXTO\x1b[0m"

El 1;3Y indica el color del texto y el 1;4Y el color del fondo.

  • Y. Selecciona el color.

Y Significado

0

Negro

1

Rojo

2

Verde

3

Amarillo

4

Azul

5

Magenta

6

Cian

7

Blanco

8

Otro. Se utiliza para indicar colores de 8 bits y de 24 bits.

  • m. Indica el final del código de color.

  • TEXTO. El texto que quieres colorear. Se pueden insertar en él tantos códigos de color como se quiera. Si un código de color cambiar el color del texto pero no el color del fondo, el color del texto se reemplaza por el nuevo color pero el del fondo no, y viceversa.

  • \x1b[0m. Devuelve el texto a sus colores por defecto.

Ejemplo:

echo -e "\x1b[1;31m ESTO ES ROJO BRILLANTE\x1b[42m CON FONDO VERDE NORMAL\x1b[0m"

El siguiente script en Bash muestra las diferentes combinaciones de colores ANSI:

#!/bin/bash
T='Texto'
echo -e "\n                 40m     41m     42m     43m     44m     45m     46m     47m";
for FGs in '    m' '   1m' '  30m' '1;30m' '  31m' '1;31m' '  32m' '1;32m' '  33m' '1;33m' '  34m' '1;34m' '  35m' '1;35m' '  36m' '1;36m' '  37m' '1;37m';
  do FG=${FGs// /}
  echo -en " $FGs \033[$FG  $T  "
  for BG in 40m 41m 42m 43m 44m 45m 46m 47m;
    do echo -en "$EINS \033[$FG\033[$BG  $T \033[0m\033[$BG \033[0m";
  done
  echo;
done
echo

Este script se ha modificado a partir del script original de Daniel Crisman (ver aquí; licencia GFDL)

Guardalo como ANSI_colors y ejecutalo así:

chmod +x ./ANSI_colors
./ANSI_colors

Estos colores también se pueden imprimir con tput:

  • tput setaf Y. Indica el color del texto.

  • tput setab Y. Indica el color del fondo.

  • tput sgr0. Devuelve el color del texto y del fondo a sus valores por defecto.

Puedes seguir el siguiente esquema para imprimirlos así:

echo -e "$(tput setaf Y)$(tput setab Y)TEXTO$(tput sgr0)"

Ejemplo:

echo -e "$(tput setaf 1) ESTO ES ROJO $(tput setab 2) CON FONDO VERDE $(tput sgr0)"

El siguiente script muestra las combinaciones de colores que puede imprimir tput:

#!/bin/bash
echo " B0  B1  B2  B3  B4  B5  B6  B7 "
for af in {0..7}
do
  for ab in {0..7}
  do
    printf "$(tput setaf $af)$(tput setab $ab) F$af "
  done
  echo "$(tput sgr0)"
done

Guardalo como tput_colors y ejecutalo así:

chmod +x ./tput_colors
./tput_colors

Colores de 8 bits

Siguen el siguiente esquema:

"\x1b[1;X8;5;ZZZmTEXTO\x1b[0m"

Donde:

  • X: 3 para el color del texto, 4 para el del fondo.

  • 5;: indica que la paleta de colores que se va a utilizar es de 8 bits.

  • ZZZ: es un número de 0 a 255 que indica el color dentro de la paleta.

El siguiente script muestra los 256 colores de esta paleta:

#!/bin/bash
echo -en "\n   +  "
for i in {0..35}; do
  printf "%2b " $i
done

printf "\n\n %3b  " 0
for i in {0..15}; do
  echo -en "\033[48;5;${i}m  \033[m "
done

#for i in 16 52 88 124 160 196 232; do
for i in {0..6}; do
  let "i = i*36 +16"
  printf "\n\n %3b  " $i
  for j in {0..35}; do
    let "val = i+j"
    echo -en "\033[48;5;${val}m  \033[m "
  done
done

echo -e "\n"

Este script se ha modificado a partir del script original de Michael Plotke (ver aquí; licencia CC BY)

Colores de 24 bits

Siguen el siguiente esquema:

"\x1b[1;X8;2;RRR;GGG;BBBmTEXTO\x1b[0m"

Donde:

  • X: 3 para el color del texto, 4 para el del fondo.

  • 2;: indica que la paleta de colores que se va a utilizar es de 24 bits.

  • RRR: es un número de 0 a 255 que indica la cantidad de rojo que contendrá el color seleccionado.

  • GGG: es un número de 0 a 255 que indica la cantidad de verde que contendrá el color seleccionado.

  • BBB: es un número de 0 a 255 que indica la cantidad de azul que contendrá el color seleccionado.

Para seleccionar colores en esta paleta puedes utilizar la heramienta online HTML Color Picker de W3Schools.