¿Cambiar el color del texto y el fondo del terminal?

74

Puedo cambiar el color a través de la preferencia, pero ¿cómo puedo cambiar el color de fondo y el color del texto del terminal a través de la línea de comando?

TechJhola
fuente
de forma permanente o incidental?
Jacob Vlijm
También puedes usar dconf. He escrito una respuesta a una pregunta similar antes: askubuntu.com/a/628129/295286
Sergiy Kolodyazhnyy
\033[00;34mFOO\033[00m
Rafael Barros

Respuestas:

50

En ciertos terminales compatibles con XTerm / ANSI (como xtermy gnome-terminal), puede establecer colores usando una paleta más grande que la paleta predeterminada de 8/16 colores (por ejemplo, usando una paleta de 88 colores, 256 colores o 16777216 colores (RGB) ; ambos xtermy gnome-terminaladmiten tanto la paleta de 256 colores como la de 16777216 colores (RGB)); tenga en cuenta que el shell podría anular esto (este es el caso, por ejemplo, para zsh)

Aquí hay una secuencia de comandos para enumerar los colores en la paleta de 256 colores junto con su código de color ANSI en terminales XTerm / ANSI compatibles con un soporte de paleta de 256 colores:

#!/bin/bash
for((i=16; i<256; i++)); do
    printf "\e[48;5;${i}m%03d" $i;
    printf '\e[0m';
    [ ! $((($i - 15) % 6)) -eq 0 ] && printf ' ' || printf '\n'
done

captura de pantalla1

captura de pantalla

Dependiendo de si desea aplicar el color al primer plano o al fondo, use un <fg_bg>valor de 38o 48(respectivamente) en el siguiente comando:

printf '\e[<fg_bg>;5;<ANSI_color_code>m'

Por ejemplo, para establecer el color de primer plano ( <fg_bg>= 38) en rojo ( <ANSI_color_code>= 196) y el color de fondo ( <fg_bg>= 48) en negro ( <ANSI_color_code>= 0):

printf '\e[38;5;196m Foreground color: red\n'
printf '\e[48;5;0m Background color: black\n'

captura de pantalla3

Es necesario volver a dibujar la solicitud utilizando printf '\e[K'para que el color de fondo se aplique a toda la línea y para que el color de primer plano se aplique al cursor:

captura de pantalla4

Lo mismo puede lograrse utilizando valores RGB en lugar de códigos de color ANSI en un terminal compatible; dependiendo de si desea aplicar el color al primer plano o al fondo, use un <fg_bg>valor de 38o 48(respectivamente) en el siguiente comando:

printf '\e[<fg_bg>;2;<R>;<G>;<B>m'

Por ejemplo, para establecer el color de primer plano ( <fg_bg>= 38) en rojo ( <R>= 255, <G>= 0, <B>= 0) y el color de fondo ( <fg_bg>= 48) en negro ( <R>= 0, <G>= 0, <B>= 0):

printf '\e[38;2;255;0;0m Foreground color: red\n'
printf '\e[48;2;0;0;0m Background color: black\n'

captura de pantalla5

Nuevamente, es necesario volver a dibujar la solicitud usando printf '\e[K'para que el color de fondo se aplique a toda la línea y para que el color de primer plano se aplique al cursor:

captura de pantalla6

Usando cualquiera de los métodos, puede usar printf '\e[0m'para restablecer todos los atributos:

captura de pantalla7

kos
fuente
1
Ambos xtermy gnome-terminalreconocen las secuencias de escape de color verdadero \ e [38/48; 2; R; G; Bm; sin embargo, xtermredondea el color real al más cercano en su paleta de 256 colores. gnome-terminalmuestra el color verdadero exacto dado en la secuencia de escape.
egmont
2
\ e [K es peligroso; en algunos emuladores (p xterm. ej. ) si el cursor está en el borde derecho (visualmente visualizado en la columna más a la derecha, pero lógicamente más allá de eso ya que un carácter ya se imprimió en la columna más a la derecha), esa última letra se elimina. Ver, por ejemplo, bugzilla.gnome.org/show_bug.cgi?id=740789 o savannah.gnu.org/bugs/?36831 .
egmont
Corrigiéndome a mí mismo: si emites \ e [K al comienzo de la línea (al comienzo del mensaje, en lugar de al final), entonces, por supuesto, es seguro. (Sin embargo, no funcionará con un comando o comando multilínea.)
egmont
@egmont Gracias por la información útil, veo que en GNOME Bugzilla que está marcado como fijo, ¿es este el caso? No puedo probar esto en este mismo momento, así que lo haré más tarde para verificar si este sigue siendo el caso (a menos que responda primero) e incluiré esa información en la respuesta.
kos
Sí, las versiones más recientes de gnome-terminal no eliminan ese carácter. Si este es el comportamiento correcto es cuestionable. Después de todo, los emuladores gráficos de terminal están emulando algunos dispositivos antiguos. ¿Deberíamos emular sus malas decisiones de diseño (como lo hace xterm aquí), o deberíamos anular (como lo hacemos en gnome-terminal)? Es una pregunta difícil sin una sola respuesta correcta.
egmont
34

Información tal como se encuentra en esta página , excluyendo la columna de vista previa:

Las secuencias se componen del carácter de Escape (a menudo representado por " ^[" o " <Esc>") seguido de algunos otros caracteres: " ^[FCm" (donde FCestá uno de los números en la lista con viñetas a continuación).

En bash, el Esccódigo puede ser uno de los siguientes:

  1. \e
  2. \033 (octal)
  3. \x1B (hexadecimal)

Nota 1: La \e[0msecuencia " " elimina todos los atributos (formato y colores). Puede ser una buena idea agregarlo al final de cada texto coloreado.

Nota 2: los colores de primer plano y de fondo pueden variar, dependiendo de la configuración del terminal y no todos los colores son compatibles .

Establecer / Restablecer

  • 0: Restablecer / eliminar todos los atributos modificadores, de primer plano y de fondo: echo -e "\e[0mNormal Text"
  • 1: Negrita / Brillante: echo -e "Normal \e[1mBold"
  • 2: Dim: echo -e "Normal \e[2mDim"
  • 4: Subrayado: echo -e "Normal \e[4mUnderlined"
  • 5: Parpadeo (no funciona en la mayoría de las terminales excepto XTerm): echo -e "Normal \e[5mBlink"
  • 7: Invertir / invertir: echo -e "Normal \e[7minverted"
  • 8: Oculto (útil para información confidencial): echo -e "Normal \e[8mHidden Input"
  • 21: Restablecer / Eliminar negrita / brillante: echo -e "Normal \e[1mBold \e[21mNormal"
  • 22: Restablecer / Eliminar dim: echo -e "Normal \e[2mDim \e[22mNormal"
  • 24: Restablecer / Eliminar subrayado: echo -e "Normal \e[4mUnderlined \e[24mNormal"
  • 25: Restablecer / Eliminar parpadeo: echo -e "Normal \e[5mBlink \e[25mNormal"
  • 27: Restablecer / Eliminar invertir / invertir: echo -e "Normal \e[7minverted \e[27mNormal"
  • 28: Restablecer / Eliminar oculto: echo -e "Normal \e[8mHidden \e[28mNormal"

Primer plano

  • 39: Predeterminado (generalmente verde, blanco o gris claro): echo -e "Default \e[39mDefault"
  • 30: Negro: echo -e "Default \e[30mBlack"(mejor combinado con un color de fondo: echo -e "Default \e[30;107mBlack on white")
  • 31: Rojo (no usar con fondo verde)
  • 32: Verde
  • 33: Amarillo
  • 34: Azul
  • 35: Magenta / Púrpura
  • 36: Cian
  • 37: Gris claro
  • 90: Gris oscuro
  • 91: Luz roja
  • 92: Verde claro
  • 93: Amarillo claro
  • 94: Azul claro
  • 95: Magenta claro / rosa
  • 96: Cian claro
  • 97: Blanco

Antecedentes

  • 49: Color de fondo predeterminado (generalmente negro o azul)
  • 40: Negro
  • 41: Rojo
  • 42: Verde
  • 43: Amarillo
  • 44: Azul
  • 45: Magenta / Púrpura
  • 46: Cian
  • 47: Gris claro (no usar con primer plano blanco)
  • 100: Gris oscuro (no usar con primer plano negro)
  • 101: Luz roja
  • 102: Verde claro (no usar con primer plano blanco)
  • 103: Amarillo claro (no usar con primer plano blanco)
  • 104: Azul claro (no usar con primer plano amarillo claro)
  • 105: Magenta claro / rosa (no usar con primer plano claro)
  • 106: Cian claro (no usar con primer plano blanco)
  • 107: Blanco (no usar con primer plano claro)

Para configurar los colores de primer plano y de fondo a la vez, use su forma echo -e "\e[S;FG;BGm". Por ejemplo: echo -e "\e[1;97;41m"(primer plano en negrita blanco sobre fondo rojo)

Para 256 opciones de color, consulte la página de origen.

Agi Hammerthief
fuente
30

Cambiar los colores de forma incidental

Si está destinado a cambiar los colores de forma incidental :

Puede usar el comando setterm :

setterm -term linux -back <background_colour> -fore <text_color> -clear

de los colores, puede elegir (tanto en el frente como en el fondo):

black|blue|green|cyan|red|magenta|yellow|white|default

para más opciones:

setterm -help

Cambiar la configuración de su perfil (color)

En 14.04, no encontré una opción para usar dconfpara configurar los colores o el terminal. Sin embargo, puedes usargconftool

  • Primero debe obtener su nombre de perfil:

    gconftool-2 --get /apps/gnome-terminal/global/profile_list
    
  • Luego, para configurar los colores de texto de su perfil:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/foreground_color" --type string "#FFFFFF"
    

    por ejemplo, para establecer el color del texto en blanco

    Lo mismo con el color de fondo:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string "#000000"
    

    por ejemplo, para establecer el color de fondo en negro

Alternativamente, para establecer el nombre de los colores, simplemente puede usar whiteo green, desde la misma paleta que el comando setterm, por ejemplo:

gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string black
Jacob Vlijm
fuente
1
Deben ser guiones dobles en el comando setterm inicial.
user1770201
Trabajó en 14.04, pero no en 16.04 (beta; no estoy seguro si esa es la razón) ... Aún así, dconf write /org/gnome/terminal/legacy/profiles:/:<profile_id>/background-color "'rgb(0,0,0)'"funcionó.
Janaka Bandara
No funciona en ubuntu 1704, se ve mal
Wax Cage
1
gconftool-2(para Ubuntu 14.04 y tal vez un par de lanzamientos siguientes), o dconfo gsettingsen las versiones más recientes de los ajustes de cambio Ubuntu gnome-terminal, y surtirá efecto inmediato en todas las pestañas y ventanas del mismo perfil. No creo que OP estuviera buscando este comportamiento.
egmont
5

Los diversos códigos de color que se usaron para obtener resultados en color también se pueden usar para obtener fondos en color :

40  black
41  red
42  green
43  yellow
44  blue
45  magenta
46  cyan
47  white

Por lo tanto, el siguiente comando convierte mi fondo en rojo:

$ echo -e '\e[0;41m'

Dependiendo del shell, el emulador de terminal, etc., es posible que no necesite el -e.

muru
fuente
3

Consulte la respuesta de kos para cambiar el primer plano o el fondo a un color particular de la paleta, o incluso a un color RGB directo en algunos terminales. El efecto de tal secuencia dura hasta que se selecciona un color diferente (o se revierte al predeterminado).

Otro enfoque, respaldado por algunos emuladores de terminal, es redefinir los valores RGB exactos de los colores de primer plano y fondo predeterminados del terminal utilizando las secuencias de escape OSC 10/11:

echo -ne '\e]10;#123456\e\\'  # set default foreground to #123456
echo -ne '\e]11;#abcdef\e\\'  # set default background to #abcdef

Es probable que esto dure mucho más tiempo (hasta que sea anulado por otro OSC 10/11 o restablecido a través de OSC 110/111), pero a diferencia del enfoque dconf, esto todavía afecta solo al terminal actual.

egmont
fuente