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

132

Usei várias cores no prompt do 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

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.

Consulte também https://unix.stackexchange.com/a/127800/10043

Michael Durrant
fonte
3
Observe que a final \]aqui não faz parte da sequência de cores; serve para definir especificamente os prompts (adicionamos alguns parágrafos ao final da minha resposta sobre isso). "Seria bom se houvesse uma forma mais legível também." -> o recorte e cole em sua própria resposta é uma maneira de fazer isso.
precisa saber é o seguinte

Respostas:

174

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

Isso está incorreto:

\033]00m\] # white

0redefine o terminal para o padrão (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 definir um prompt).

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

uma lista aqui que adiciona 7 cores de primeiro plano e 7 de fundo que eu nunca 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 está agora), poderá aplicar cores neste gráfico:

cartela de cores xterm 256

A sequência ANSI para selecioná-las, usando o número no canto inferior esquerdo, inicia 38;5;no primeiro plano e no plano 48;5;de fundo, depois o número da cor, por exemplo:

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

Dá-me uma cor laranja clara no bronzeado (ou seja, a tabela de cores é aproximadamente aproximada).

Você pode ver as cores nesta tabela 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 é auto-explicativa.

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

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

Cuidado ao usar sequências de escape de cores em seu prompt, coloque-as \entre colchetes de escape ( prefixados), desta forma:

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

Observe que o [interior da sequência de cores não é escapado, mas os anexos são. O objetivo deste último é indicar ao shell que a sequência incluída não conta para o comprimento de caracteres do prompt. Se essa contagem estiver errada, coisas estranhas acontecerão quando você voltar ao histórico, por exemplo, se for muito longo, o excesso de comprimento da última sequência rolada aparecerá anexado ao seu prompt e você não poderá retroceder no (é ignorado da mesma maneira que o prompt).

Observe também que se você deseja incluir a saída de um comando executado toda vez que o prompt é usado (em vez de apenas uma vez quando o prompt é definido), você deve configurá-lo como uma string literal com aspas simples, por exemplo:

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

Embora este não seja um ótimo exemplo, se você estiver satisfeito com o escape especial \dou \D{format}imediato do bash - que não é o tópico da pergunta, mas pode ser encontrado em man bashabaixo PROMPTING. Existem várias outras fugas úteis, como \wdiretório \uatual, 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 outro 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ê pode usar esta fórmula no shell script:

#!/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"
Cachinhos Dourados
fonte
1
Sugiro que o solicitante original teste a disponibilidade de cores com um gráfico de teste. Existe um aqui: robmeerman.co.uk/unix/… ou pode ser muito fácil fazer um, se não confiar nos scripts de shell encontrados na Internet.
22914 IBr #
1
@IBr Ponto interessante. A visualização de todas as cores é uma tarefa simples, então algumas linhas do bash acima são necessárias.
Goldilocks
O script de referência de cores encontrado aqui pode ser mais útil, sendo compacto e ainda tendo os códigos e com cada cor separada para maior clareza.
Michael Plotke
1
Por favor, não use echopara nada além de texto literal que não comece com um hífen ( -). Isso não é portável. Todas as implementações comuns violam o padrão que afirma que nenhuma opção deve ser suportada. Pior, eles são inconsistentes. Você deve usar em seu printflugar. (E não incorporar variáveis dentro declarações printf, uso %s.)
nyuszika7h
2
colortest-256liste a paleta xterm em uma boa forma compacta. ( apt-get install colortestse estiver faltando)
Volker Siegel
38

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 em https://wiki.archlinux.org/index.php/Color_Bash_Prompt

Michael Durrant
fonte
2
Obrigado por finalmente fornecer as seqüências realmente úteis.
lbutlr 28/02
21

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 "\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
}

Você pode jogá-lo em .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 fiz com o meu nome abaixo.

saídas colorgrid (): Saída de colorgrid ()

Mudei meu nome no meu .bash_profile, fazendo o seguinte:

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 "

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

Plasmarob
fonte
3
Estou muito feliz por ter compartilhado isso. veio a calhar hoje a fixação de uma configuração bashrc e terminal para ser menos hediondo. Também vi a data - amanhã será há 2 anos.
Plasmarob 27/05
12

Outro script como o postado pela TAFKA 'goldilocks' para exibir cores 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

O tamanho deve estar correto para o terminal que você está usando. É um pouco exagerado para esse propósito, mas agora você pode controlar muitos aspectos de como isso é exibido através de parâmetros. Felizmente, todos eles são auto-explicativos.

krowe
fonte
1
Nenhuma matança como um exagero :)
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
fonte