¿Qué códigos de color puedo usar en mi solicitud de PS1?

132

Utilicé varios colores en mi indicador de PS1, como

\033]01;31\] # pink
\033]00m\]   # white
\033]01;36\] # bold green
\033]02;36\] # green
\033]01;34\] # blue
\033]01;33\] # bold yellow

¿Dónde puedo encontrar una lista de los códigos de colores que puedo usar?

Miré Colorize Bash Console Color pero no respondió mi pregunta sobre una lista de los códigos reales.

Sería bueno si hubiera una forma más legible también.

Ver también https://unix.stackexchange.com/a/127800/10043

Michael Durrant
fuente
3
Tenga en cuenta que el final \]aquí en realidad no es parte de la secuencia de colores; cumple un propósito al establecer avisos específicamente (he agregado algunos párrafos al final de mi respuesta sobre esto). "Sería bueno si hubiera una forma más legible también". -> cortar y pegar en tu propia respuesta es una forma de hacerlo.
Ricitos

Respuestas:

174

Esas son secuencias de escape ANSI ; ese enlace es a una tabla de códigos de color, pero también hay otras cosas interesantes en esa página de Wikipedia. No todos funcionan en (por ejemplo) una consola Linux normal.

Esto es incorrecto:

\033]00m\] # white

0restablece el terminal a su valor predeterminado (que probablemente sea blanco). El código real para el primer plano blanco es 37. Además, la llave de cierre escapada al final ( \]) no forma parte de la secuencia de colores (consulte los últimos párrafos a continuación para obtener una explicación de su propósito al configurar un aviso).

Tenga en cuenta que algunos terminales GUI le permiten especificar un esquema de color personalizado. Esto afectará la salida.

Aquí hay una lista que agrega 7 colores de primer plano y 7 de fondo que no había visto antes, pero parecen funcionar:

# Foreground colors
90   Dark gray  
91   Light red  
92   Light green    
93   Light yellow   
94   Light blue 
95   Light magenta  
96   Light cyan  

# Background colors
100  Dark gray  
101  Light red  
102  Light green    
103  Light yellow   
104  Light blue 
105  Light magenta  
106  Light cyan 

Además, si tiene un terminal GUI de 256 colores (creo que la mayoría de ellos son ahora), puede aplicar los colores de este cuadro:

carta de colores xterm 256

La secuencia ANSI para seleccionarlos, usando el número en la esquina inferior izquierda, comienza 38;5;para el primer plano y 48;5;para el fondo, luego el número de color, por ejemplo:

echo -e "\\033[48;5;95;38;5;214mhello world\\033[0m"

Me da un color naranja claro en bronceado (es decir, la tabla de colores es aproximadamente aproximada).

Puede ver los colores en este cuadro 1 tal como aparecerían en su terminal con bastante facilidad:

#!/bin/bash

color=16;

while [ $color -lt 245 ]; do
    echo -e "$color: \\033[38;5;${color}mhello\\033[48;5;${color}mworld\\033[0m"
    ((color++));
done  

La salida se explica por sí misma.

Algunos sistemas configuran la variable $ TERM xterm-256colorsi está en un terminal de 256 colores mediante algún código de shell /etc/profile. En otros, debería poder configurar su terminal para usar esto. Eso permitirá que las aplicaciones TUI sepan que hay 256 colores y le permitirá agregar algo como esto a su ~/.bashrc:

if [[ "$TERM" =~ 256color ]]; then
     PS1="MyCrazyPrompt..."
fi

Tenga en cuenta que cuando utiliza secuencias de escape de color en su solicitud, debe encerrarlas \entre corchetes ( prefijados), como este:

PS1="\[\033[01;32m\]MyPrompt: \[\033[0m\]"

Observe que el [interior de la secuencia de colores no se escapa, pero sí los que lo rodean. El propósito de este último es indicar al shell que la secuencia encerrada no cuenta para la longitud de caracteres de la solicitud. Si ese conteo es incorrecto, sucederán cosas extrañas al desplazarse hacia atrás por el historial, por ejemplo, si es demasiado largo, el exceso de longitud de la última cadena desplazada aparecerá adjunta a su mensaje y no podrá retroceder en (se ignora de la misma manera que el aviso).

También tenga en cuenta que si desea incluir la salida de un comando ejecutado cada vez que se utiliza el indicador (en lugar de solo una vez cuando se configura el indicador), debe configurarlo como una cadena literal con comillas simples, por ejemplo:

PS1='\[\033[01;32m\]$(date): \[\033[0m\]'

Aunque este no es un gran ejemplo si está satisfecho con el uso de escapes especiales \do \D{format}rápidos de bash, que no son el tema de la pregunta, pero se pueden encontrar en la man bashsección siguiente PROMPTING. Hay varios otros escapes útiles, como \wpara el directorio actual, \upara el usuario actual, etc.


1. La parte principal de este cuadro, los colores 16 - 231 (tenga en cuenta que no están en orden numérico) son un cubo de color RGB de 6 x 6 x 6. "Cubo de color" se refiere al hecho de que un espacio de color RGB se puede representar utilizando una matriz tridimensional (con un eje para el rojo, uno para el verde y uno para el azul). Cada color en el cubo aquí se puede representar como coordenadas en una matriz de 6 x 6 x 6, y el índice en el gráfico se calcula así:

    16 + R * 36 + G * 6 + B

El primer color en el cubo, en el índice 16 en el gráfico, es negro (RGB 0, 0, 0). Puede usar esta fórmula en el script de shell:

#!/bin/sh                                                         

function RGBcolor {                                               
    echo "16 + $1 * 36 + $2 * 6 + $3" | bc                        
}                                                                 

fg=$(RGBcolor 1 0 2)  # Violet                                            
bg=$(RGBcolor 5 3 0)  # Bright orange.                                            

echo -e "\\033[1;38;5;$fg;48;5;${bg}mviolet on tangerine\\033[0m"
encerrada dorada
fuente
1
Sugiero que el autor original pruebe la disponibilidad de color con una tabla de prueba. Hay uno aquí: robmeerman.co.uk/unix/… o puede ser muy fácil hacerlo, si uno no confía en los scripts de shell que se encuentran en Internet.
IBr
1
@IBr Punto interesante. Solo ver todos los colores es una tarea simple, así que tengo algunas líneas de bash para hacer esto.
Ricitos
El guión de referencia de color que se encuentra aquí podría ser más útil, ya que es compacto pero aún tiene los códigos y con cada color separado para mayor claridad.
Michael Plotke
1
Por favor, no lo use echopara otra cosa que no sea texto literal que no comience con un guión ( -). Es inportable. Todas las implementaciones comunes violan el estándar que establece que no se deben admitir opciones. Peor aún, son inconsistentes. Deberías usar printfen su lugar. (Y no incrustar variables dentro de sentencias printf, usar %s.)
nyuszika7h
2
colortest-256Enumere la paleta Xterm en una forma compacta y agradable. ( apt-get install colortestsi falta)
Volker Siegel
38

Parece que al menos parte de la lista es:

txtblk='\e[0;30m' # Black - Regular
txtred='\e[0;31m' # Red
txtgrn='\e[0;32m' # Green
txtylw='\e[0;33m' # Yellow
txtblu='\e[0;34m' # Blue
txtpur='\e[0;35m' # Purple
txtcyn='\e[0;36m' # Cyan
txtwht='\e[0;37m' # White
bldblk='\e[1;30m' # Black - Bold
bldred='\e[1;31m' # Red
bldgrn='\e[1;32m' # Green
bldylw='\e[1;33m' # Yellow
bldblu='\e[1;34m' # Blue
bldpur='\e[1;35m' # Purple
bldcyn='\e[1;36m' # Cyan
bldwht='\e[1;37m' # White
unkblk='\e[4;30m' # Black - Underline
undred='\e[4;31m' # Red
undgrn='\e[4;32m' # Green
undylw='\e[4;33m' # Yellow
undblu='\e[4;34m' # Blue
undpur='\e[4;35m' # Purple
undcyn='\e[4;36m' # Cyan
undwht='\e[4;37m' # White
bakblk='\e[40m'   # Black - Background
bakred='\e[41m'   # Red
bakgrn='\e[42m'   # Green
bakylw='\e[43m'   # Yellow
bakblu='\e[44m'   # Blue
bakpur='\e[45m'   # Purple
bakcyn='\e[46m'   # Cyan
bakwht='\e[47m'   # White
txtrst='\e[0m'    # Text Reset

basado en https://wiki.archlinux.org/index.php/Color_Bash_Prompt

Michael Durrant
fuente
2
Gracias por finalmente proporcionar cadenas realmente utilizables.
lbutlr
21

Escribí una función bash que puede mostrarle todos los colores, si esto ayuda.

function colorgrid( )
{
    iter=16
    while [ $iter -lt 52 ]
    do
        second=$[$iter+36]
        third=$[$second+36]
        four=$[$third+36]
        five=$[$four+36]
        six=$[$five+36]
        seven=$[$six+36]
        if [ $seven -gt 250 ];then seven=$[$seven-251]; fi

        echo -en "\033[38;5;$(echo $iter)m█ "
        printf "%03d" $iter
        echo -en "   \033[38;5;$(echo $second)m█ "
        printf "%03d" $second
        echo -en "   \033[38;5;$(echo $third)m█ "
        printf "%03d" $third
        echo -en "   \033[38;5;$(echo $four)m█ "
        printf "%03d" $four
        echo -en "   \033[38;5;$(echo $five)m█ "
        printf "%03d" $five
        echo -en "   \033[38;5;$(echo $six)m█ "
        printf "%03d" $six
        echo -en "   \033[38;5;$(echo $seven)m█ "
        printf "%03d" $seven

        iter=$[$iter+1]
        printf '\r\n'
    done
}

Puede incluirlo en un .bashrc / .bash_profile / .bash_aliases o guardarlo como un script y ejecutarlo de esa manera. Puede usar los colores para cambiar el color como hice con mi nombre a continuación.

salidas colorgrid (): Salida de colorgrid ()

Cambié mi nombre en mi .bash_profile haciendo esto:

if [ "$USER" = "plasmarob" ]; then
    p="\[\033[01;38;5;52m\]p"
    l="\[\033[01;38;5;124m\]l"
    a="\[\033[01;38;5;196m\]a"
    s="\[\033[01;38;5;202m\]s"
    m="\[\033[01;38;5;208m\]m"
    a2="\[\033[01;38;5;214m\]a"
    r="\[\033[01;38;5;220m\]r"
    o="\[\033[01;38;5;226m\]o"
    b="\[\033[01;38;5;228m\]b"
    local __user_and_host="$p$l$a$s$m$a2$r$o$b"
else
    local __user_and_host="\[\033[01;36m\]\u"
fi   

...

export PS1="$__user_and_host $__cur_location $__git_branch_color$__git_branch$__prompt_tail$__last_color "

Tenga en cuenta que el prefijo 01 en una cadena como lo \[\033[01;38;5;214m\]a establece en negrita.

Plasmarob
fuente
3
Estoy muy contento de haber compartido esto. hoy fue útil arreglar un bashrc y una configuración de terminal para que sea menos horrible. También vi la fecha, será hace 2 años mañana.
Plasmarob
12

Otro script como el publicado por TAFKA 'goldilocks' para mostrar colores, que es quizás un poco más práctico para fines de referencia:

#!/bin/bash

useage() {
  printf "\n\e[1;4mAscii Escape Code Helper Utility\e[m\n\n"
  printf "  \e[1mUseage:\e[m colors.sh [-|-b|-f|-bq|-fq|-?|?] [start] [end] [step]\n\n"
  printf "The values for the first parameter may be one of the following:\n\n"
  printf "  \e[1m-\e[m  Will result in the default output.\n"
  printf "  \e[1m-b\e[m This will display the 8 color version of this chart.\n"
  printf "  \e[1m-f\e[m This will display the 256 color version of this chart using foreground colors.\n"
  printf "  \e[1m-q\e[m This will display the 256 color version of this chart without the extra text.\n"
  printf "  \e[1m-bq\e[m    This will display the 8 color version of this chart without the extra text.\n"
  printf "  \e[1m-fq\e[m    This will display the 256 color version of this chart using foreground colors without the extra text.\n"
  printf "  \e[1m-?|?\e[m   Displays this help screen.\n"
  printf "\nThe remaining parameters are only used if the first parameter is one of: \e[1m-,-f,q,fq\e[m\n\n"
  printf "  \e[1mstart\e[m  The color index to begin display at.\n"
  printf "  \e[1mend\e[m    The color index to stop display at.\n"
  printf "  \e[1mstart\e[m  The number of indexes to increment color by each iteration.\n\n\n"

}
verbose() {
  if [[ "$1" != "-q" && "$1" != "-fq" && "$1" != "-bq" ]]; then
    printf "\nTo control the display style use \e[1m%s\e[m where \e[1m%s\e[m is:\n" '\e[{$value}[:{$value}]m' '{$value}'
    printf "\n  0 Normal \e[1m1 Bold\e[m \e[2m2 Dim\e[m \e[3m3 ???\e[m \e[4m4 Underlined\e[m \e[5m5 Blink\e[m \e[6m6 ???\e[m \e[7m7 Inverted\e[m \e[8m8 Hidden\e[m\n\n"
    printf "If \e[1m%s\e[m is not provided it will reset the display.\n\n" '{$value}'
  fi
}
eight_color() {
    local fgc bgc vals seq0
    if [ "$1" != "-bq" ]; then
        printf "\n\e[1;4m8 Color Escape Value Pallette\e[m\n\n"
        printf "Color escapes are \e[1m%s\e[m\n" '\e[${value};...;${value}m'
        printf "    Values \e[1m30..37\e[m are \e[1mforeground\e[m colors\n"
        printf "    Values \e[1m40..47\e[m are \e[1mbackground\e[m colors\n\n"  
    fi
    for fgc in {30..37}; do
        for bgc in {40..47}; do
            fgc=${fgc#37}
            bgc=${bgc#40}
            vals="${fgc:+$fgc;}${bgc}"
            vals=${vals%%;}
            seq0="${vals:+\e[${vals}m}"
            printf "  %-9s" "${seq0:-(default)}"
            printf " ${seq0}TEXT\e[m"
            printf " \e[${vals:+${vals+$vals;}}1mBOLD\e[m"
        done
        printf "\e[0m\n"
    done
}


if [[ "$1" == "-b" ||  "$1" == "-bq" ]]; then
  eight_color "$1"
  verbose "$1"
elif [[ "$1" == "" || "$1" == "-" ||  "$1" == "-f" ||  "$1" == "-q" ||  "$1" == "-fq" ]]; then
  start=${2:-0}
  end=${3:-255}
  step=${4:-1}
  color=$start
  style="48;5;"
  if [[ "$1" == "-f" || "$1" == "-fq" ]]; then
   style="38;5;"
  fi
  perLine=$(( ( $(tput cols) - 2 ) / 9 ));
  if [[ "$1" != "-q" && "$1" != "-fq" ]]; then
    printf "\n\e[1;4m256 Color Escape Value Pallette\e[0m\n\n"
    printf "    \e[1m%s\e[m for \e[1mbackground\e[m colors\n    \e[1m%s\e[m for \e[1mforeground\e[m colors\n\n" '\e[48;5;${value}m' '\e[38;5;${value}m'
  fi
  while [ $color -le $end ]; do
    printf "\e[m \e[${style}${color}m  %3d  \e[m " $color
    ((color+=step))
    if [ $(( ( ( $color - $start ) / $step ) % $perLine )) -eq 0 ]; then
      printf "\n"
    fi
    done
    printf "\e[m\n"
    verbose "$1"
else
  useage
fi

Esto debería dimensionarse correctamente para el terminal que está utilizando. Es un poco exagerado para este propósito, pero ahora puede controlar muchos aspectos de cómo se muestra esto a través de parámetros. Con suerte, todos se explican por sí mismos.

krowe
fuente
1
No kill like overkill :)
Navin
-1
export PS1=\n\[\e[32;1m\](\[\e[37;1m\]\u\[\e[32;1m\])-(\[\e[37;1m\]jobs:\j\[\e[32;1m\])-(\[\e[37;1m\]\w\[\e[32;1m\])\n$ \[\e[0m\]
Ashish Rana
fuente