Quais códigos de cores posso usar no prompt do meu PS1?

122

Eu usei várias cores no meu prompt do PS1, como

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

Onde posso encontrar uma lista dos códigos de cores que posso usar?

Eu olhei para Colorize Bash Console Color mas ele não respondeu minha pergunta sobre uma lista dos códigos reais.

Seria bom se houvesse uma forma mais legível também.

Veja também link

    
por Michael Durrant 12.04.2014 / 17:38

5 respostas

162

Essas são sequências de escape ANSI ; esse link é para um gráfico de códigos de cores, mas há outras coisas interessantes nessa página da Wikipédia também. Nem todos funcionam em (por exemplo) um console normal do Linux.

Isso está incorreto:

3]00m\] # white

0 redefine o terminal para o padrão (que provavelmente é branco). O código real para o primeiro plano branco é 37. Além disso, a chave de fechamento com escape no final ( \] ) não faz parte da sequência de cores (consulte os últimos parágrafos abaixo para obter uma explicação sobre sua finalidade ao configurar um prompt). / p>

Observe que alguns terminais da GUI permitem que você especifique um esquema de cores personalizado. Isso afetará a saída.

uma lista aqui que adiciona 7 cores de primeiro plano e 7 cores de fundo que eu não tinha visto antes, mas elas parecem 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 

Além disso, se você tiver um terminal GUI de 256 cores (acho que a maioria deles é agora), é possível aplicar cores neste gráfico:

AsequênciaANSIparaselecioná-los,usandoonúmeronocantoinferioresquerdo,inicia38;5;paraoprimeiroplanoe48;5;paraosegundoplano,depoisonúmerodacor,porexemplo:

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

Me dá uma luz laranja na cor bronzeada (ou seja, a cartela de cores é aproximadamente aproximada).

Você pode ver as cores neste gráfico 1 como elas apareceriam no seu terminal com bastante facilidade:

#!/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  

A saída é autoexplicativa.

Alguns sistemas definem a variável $ TERM como xterm-256color se você estiver em um terminal de 256 cores por meio de algum código de shell em /etc/profile . Em outros, você deve poder configurar seu terminal para usar isso. Isso permitirá que os aplicativos da TUI saibam que há 256 cores e permitirão que você adicione algo assim ao seu ~/.bashrc :

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

Tenha em atenção que, quando utilizar sequências de escape de cores na sua linha de comandos, deve colocá-las entre parênteses rectos ( \ prefixed), da seguinte forma:

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

Observe que o interior de [ na sequência de cores não é escapado, mas os que estão em anexo são. O objetivo deste último é indicar ao shell que a seqüência incluída não conta para o tamanho do caractere do prompt. Se essa contagem estiver errada, coisas estranhas acontecerão quando você rolar pelo histórico, por exemplo, se for muito longo, o comprimento em excesso da última string rolada aparecerá anexado ao seu prompt e você não poderá retroceder ele (é ignorado da mesma forma que o prompt é).

Observe também que, se você quiser incluir a saída de um comando toda vez que o prompt for usado (em oposição a apenas uma vez quando o prompt estiver configurado), você deverá defini-lo como uma string literal com aspas simples, por exemplo:

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

Embora este não seja um ótimo exemplo, se você estiver satisfeito com o uso dos vazamentos especiais \d ou \D{format} do bash - que não são o tópico da pergunta, mas podem ser encontrados em man bash under PROMPTING . Existem várias outras fugas úteis, como \w para o diretório atual, \u para o usuário atual, etc.

1. A parte principal deste gráfico, as cores 16 - 231 (observe que elas não estão em ordem numérica) são um cubo de cores 6 x 6 x 6 RGB. "Cubo de cores" refere-se ao fato de que um espaço de cores RGB pode ser representado usando uma matriz tridimensional (com um eixo para vermelho, um para verde e um para azul). Cada cor no cubo aqui pode ser representada como coordenadas em uma matriz 6 x 6 x 6, e o índice no gráfico é calculado da seguinte forma:

    16 + R * 36 + G * 6 + B

A primeira cor no cubo, no índice 16 no gráfico, é preta (RGB 0, 0, 0). Você poderia usar essa fórmula no 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"
    
por 12.04.2014 / 17:50
37

Parece que pelo menos parte da lista é:

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

com base no link

    
por 12.04.2014 / 17:49
15

Eu escrevi uma função bash que pode mostrar todas as cores, se isso ajudar.

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 "3[38;5;$(echo $iter)m█ "
        printf "%03d" $iter
        echo -en "   3[38;5;$(echo $second)m█ "
        printf "%03d" $second
        echo -en "   3[38;5;$(echo $third)m█ "
        printf "%03d" $third
        echo -en "   3[38;5;$(echo $four)m█ "
        printf "%03d" $four
        echo -en "   3[38;5;$(echo $five)m█ "
        printf "%03d" $five
        echo -en "   3[38;5;$(echo $six)m█ "
        printf "%03d" $six
        echo -en "   3[38;5;$(echo $seven)m█ "
        printf "%03d" $seven

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

Você pode jogar isso em um .bashrc / .bash_profile / .bash_aliases ou salvá-lo como um script e executá-lo dessa maneira. Você pode usar as cores para mudar de cor como eu fiz com o meu nome abaixo.

saídas colorgrid ():

Eualtereimeunomeemmeu.bash_profilefazendoisso:

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

...

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

Observe que o prefixo 01 em uma string como \[3[01;38;5;214m\]a define como negrito.

    
por 27.05.2016 / 18:03
11

Outro roteiro como o publicado por goldilocks da TAFKA para exibir cores, o que talvez seja um pouco mais prático para fins de referência:

#!/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

Isso deve dimensionar corretamente para o terminal que você está usando. É um pouco exagerado para essa finalidade, mas agora você pode controlar muitos aspectos de como isso é exibido por meio de parâmetros. Espero que sejam todos auto-explicativos.

    
por 13.04.2014 / 00:58
0
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\]
    
por 28.05.2018 / 20:52