Quali codici colore posso usare nel mio prompt di PS1?


132

Ho usato diversi colori nel mio prompt di PS1 come

\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

Dove posso trovare un elenco dei codici colore che posso usare?

Ho guardato Colorize Bash Console Color ma non ha risposto alla mia domanda su un elenco dei codici effettivi.

Sarebbe bello se ci fosse anche un modulo più leggibile.

Vedi anche https://unix.stackexchange.com/a/127800/10043


3
Nota che il finale \]qui non è in realtà parte della sequenza dei colori; serve uno scopo specifico nell'impostazione dei prompt (ho aggiunto alcuni paragrafi alla fine della mia risposta al riguardo). "Sarebbe bello se ci fosse anche un modulo più leggibile." -> tagliare e incollare nella tua risposta è un modo per farlo.
Riccioli d'oro

Risposte:


174

Quelle sono sequenze di escape ANSI ; quel collegamento è a una tabella di codici colore ma ci sono anche altre cose interessanti su quella pagina di Wikipedia. Non tutti funzionano su (ad esempio) una normale console Linux.

Questo non è corretto:

\033]00m\] # white

0ripristina il terminale al suo valore predefinito (che è probabilmente bianco). Il codice effettivo per il primo piano bianco è 37. Inoltre, la parentesi graffa di chiusura con escape alla fine ( \]) non fa parte della sequenza di colori (vedere gli ultimi paragrafi seguenti per una spiegazione del loro scopo nell'impostazione di un prompt).

Si noti che alcuni terminali della GUI consentono di specificare una combinazione di colori personalizzata. Ciò influenzerà l'output.

C'è un elenco qui che aggiunge 7 colori di primo piano e 7 di sfondo che non avevo mai visto prima, ma sembrano funzionare:

# 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 

Inoltre, se hai un terminale GUI a 256 colori (penso che la maggior parte di essi sia ora), puoi applicare i colori da questo grafico:

xterm 256 cartella colori

La sequenza ANSI per selezionarli, usando il numero nell'angolo in basso a sinistra, inizia 38;5;per il primo piano e 48;5;per lo sfondo, quindi il numero di colore, quindi ad esempio:

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

Mi dà un arancione chiaro sull'abbronzatura (il che significa che la tabella dei colori è approssimativamente approssimativa).

Puoi vedere i colori in questo grafico 1 come apparirebbero abbastanza facilmente sul tuo terminale:

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

L'output è autoesplicativo.

Alcuni sistemi impostano la variabile $ TERM su xterm-256colorse ci si trova su un terminale a 256 colori tramite un codice shell in /etc/profile. Su altri, dovresti essere in grado di configurare il tuo terminale per usarlo. Ciò consentirà alle applicazioni TUI di sapere che ci sono 256 colori e ti consentirà di aggiungere qualcosa di simile al tuo ~/.bashrc:

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

Fai attenzione che quando usi sequenze di escape colore nel tuo prompt, dovresti racchiuderle \tra parentesi quadre con escape ( prefisso), in questo modo:

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

Notare che l' [interno della sequenza dei colori non è sfuggito, ma quelli racchiusi lo sono. Lo scopo di quest'ultimo è di indicare alla shell che la sequenza racchiusa non conta per la lunghezza dei caratteri del prompt. Se il conteggio è errato, succederanno cose strane quando si scorre indietro nella cronologia, ad esempio, se è troppo lungo, la lunghezza in eccesso dell'ultima stringa fatta scorrere apparirà collegata al prompt e non sarà possibile tornare indietro (viene ignorato allo stesso modo del prompt).

Si noti inoltre che se si desidera includere l'output di un comando eseguito ogni volta che viene utilizzato il prompt (anziché solo una volta quando viene impostato il prompt), è necessario impostarlo come stringa letterale con virgolette singole, ad esempio:

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

Anche se questo non è un grande esempio se sei soddisfatto dell'uso delle escape speciali \do \D{format}prompt di bash, che non sono l'argomento della domanda, ma puoi trovarle man bashsotto PROMPTING. Esistono varie altre escape utili come \wper la directory corrente, \uper l'utente corrente, ecc.


1. La parte principale di questo grafico, i colori 16 - 231 (notare che non sono in ordine numerico) sono un cubo di colore RGB 6 x 6 x 6. "Cubo di colore" si riferisce al fatto che uno spazio cromatico RGB può essere rappresentato utilizzando una matrice tridimensionale (con un asse per il rosso, uno per il verde e uno per il blu). Ogni colore nel cubo qui può essere rappresentato come coordinate in un array 6 x 6 x 6 e l'indice nel grafico viene calcolato in questo modo:

    16 + R * 36 + G * 6 + B

Il primo colore nel cubo, all'indice 16 nel grafico, è nero (RGB 0, 0, 0). È possibile utilizzare questa formula nello script di 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"

1
Suggerisco a chi richiede l'originale di testare la disponibilità dei colori con un diagramma di prova. Ce n'è uno qui: robmeerman.co.uk/unix/… oppure può essere molto semplice eseguirne uno, se uno non si fida degli script di shell trovati su Internet.
IBr

1
@IBr Punto interessante. La sola visualizzazione di tutti i colori è un compito semplice, quindi ho poche righe di bash sopra per farlo.
Riccioli d'oro,

Lo script di riferimento colore trovato qui potrebbe essere più utile, essendo compatto ma pur avendo i codici e con ogni colore separato per chiarezza.
Michael Plotke,

1
Per favore, non usare echoper altro che testo letterale che non inizia con un trattino ( -). È insostituibile. Tutte le implementazioni comuni violano lo standard in base al quale nessuna opzione dovrebbe essere supportata. Peggio ancora, sono incoerenti. Dovresti usare printfinvece. (E non incorporare le variabili nelle istruzioni printf, utilizzare %s.)
nyuszika7h

2
colortest-256elenca le pallette xterm in una bella forma compatta. ( apt-get install colortestse mancante)
Volker Siegel,

38

Sembra che almeno una parte dell'elenco sia:

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

basato su https://wiki.archlinux.org/index.php/Color_Bash_Prompt


2
Grazie per aver finalmente fornito stringhe effettivamente utilizzabili.
lbutlr,

21

Ho scritto una funzione bash che può mostrarti tutti i colori, se questo aiuta.

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
}

Puoi lanciarlo in un .bashrc / .bash_profile / .bash_aliases o salvarlo come script ed eseguirlo in quel modo. Puoi usare i colori per cambiare colore come ho fatto con il mio nome qui sotto.

colorgrid () output: Uscita di colorgrid ()

Ho cambiato il mio nome nel mio .bash_profile facendo questo:

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 "

Nota che il prefisso 01 in una stringa come lo \[\033[01;38;5;214m\]a imposta in grassetto.


3
Sono davvero contento di averlo condiviso. è tornato utile oggi riparando una configurazione bashrc e terminale per essere meno orribile. Ho appena visto anche la data - sarà 2 anni fa domani.
Plasmarob,

12

Un'altra sceneggiatura come quella pubblicata da 'goldilocks' di TAFKA per la visualizzazione di colori che è forse un po 'più pratica a scopo di riferimento:

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

Questo dovrebbe essere dimensionato correttamente per il terminale in uso. È un po 'esagerato per questo scopo, ma ora puoi controllare molti aspetti di come questo viene visualizzato tramite parametri. Spero che siano tutti autoesplicativi.


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\]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.