web-dev-qa-db-fra.com

Quels codes de couleur puis-je utiliser dans mon invite PS1?

J'ai utilisé plusieurs couleurs dans mon invite PS1 telles que

\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

Où puis-je trouver une liste des codes de couleur que je peux utiliser?

J'ai regardé Colorize Bash Console Color mais cela n'a pas répondu à ma question sur une liste des codes réels.

Ce serait bien s'il y avait aussi un formulaire plus lisible.

Voir aussi https://unix.stackexchange.com/a/127800/1004

141
Michael Durrant

Ce sont séquences d'échappement ANSI ; ce lien est vers un tableau de codes de couleur, mais il y a aussi d'autres choses intéressantes sur cette page Wikipedia. Tous ne fonctionnent pas (par exemple) sur une console Linux normale.

Ceci est une erreur:

\033]00m\] # white

0 Réinitialise le terminal à sa valeur par défaut (qui est probablement blanche). Le code réel pour le premier plan blanc est 37. De plus, l'accolade fermante d'échappement à la fin (\]) Ne fait pas partie de la séquence de couleurs (voir les derniers paragraphes ci-dessous pour une explication de leur objectif dans la définition d'une invite ).

Notez que certains terminaux GUI vous permettent de spécifier un schéma de couleurs personnalisé. Cela affectera la sortie.

Il y a ne liste ici qui ajoute 7 couleurs de premier plan et 7 couleurs d'arrière-plan que je n'avais pas vues auparavant, mais elles semblent fonctionner:

# 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 

De plus, si vous avez un terminal GUI 256 couleurs (je pense que la plupart d'entre eux le sont maintenant), vous pouvez appliquer les couleurs de ce tableau:

xterm 256 color chart

La séquence ANSI pour les sélectionner, en utilisant le numéro dans le coin inférieur gauche, commence 38;5; Pour le premier plan et 48;5; Pour l'arrière-plan, puis le numéro de couleur, par exemple:

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

Me donne un orange clair sur le bronzage (ce qui signifie que le nuancier est approximativement approximatif).

Vous pouvez voir les couleurs dans ce tableau1 car ils apparaîtront assez facilement sur votre terminal:

#!/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 sortie est explicite.

Certains systèmes définissent la variable $ TERM sur xterm-256color Si vous êtes sur un terminal 256 couleurs via du code Shell dans /etc/profile. Sur d'autres, vous devriez pouvoir configurer votre terminal pour l'utiliser. Cela permettra aux applications TUI de savoir qu'il y a 256 couleurs et vous permettra d'ajouter quelque chose comme ça à votre ~/.bashrc:

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

Sachez que lorsque vous utilisez des séquences d'échappement de couleur dans votre invite, vous devez les placer entre crochets d'échappement (préfixé \), Comme ceci:

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

Notez que l'intérieur de [ De la séquence de couleurs n'est pas échappé, mais ceux qui l'entourent le sont. Le but de ce dernier est d'indiquer au Shell que la séquence incluse ne compte pas dans la longueur de caractère de l'invite. Si ce décompte est incorrect, des choses étranges se produiront lorsque vous remonterez dans l'historique, par exemple, s'il est trop long, la longueur excessive de la dernière chaîne défilée apparaîtra attachée à votre invite et vous ne pourrez pas revenir en arrière dans (il est ignoré de la même manière que l'invite).

Notez également que si vous souhaitez inclure la sortie d'une commande exécutée à chaque utilisation de l'invite (par opposition à une seule fois lorsque l'invite est définie), vous devez la définir comme une chaîne littérale avec des guillemets simples, par exemple:

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

Bien que ce ne soit pas un bon exemple si vous êtes satisfait de l'utilisation des échappements spéciaux \d Ou \D{format} De bash - qui ne sont pas le sujet de la question mais peuvent être trouvés dans man bash sous PROMPTING. Il existe plusieurs autres échappements utiles tels que \w Pour le répertoire actuel, \u Pour l'utilisateur actuel, etc.


1. La partie principale de ce tableau, les couleurs 16 à 231 (notez qu'elles ne sont pas dans l'ordre numérique) sont un cube de couleurs RVB 6 x 6 x 6. "Cube de couleur" se réfère au fait qu'un espace colorimétrique RVB peut être représenté à l'aide d'un réseau tridimensionnel (avec un axe pour le rouge, un pour le vert et un pour le bleu). Chaque couleur du cube ici peut être représentée sous forme de coordonnées dans un tableau 6 x 6 x 6, et l'indice du graphique calculé de la manière suivante:

    16 + R * 36 + G * 6 + B

La première couleur du cube, à l'index 16 du graphique, est le noir (RVB 0, 0, 0). Vous pouvez utiliser cette formule dans le script 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"
187
goldilocks

On dirait qu'au moins une partie de la liste est:

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

basé sur https://wiki.archlinux.org/index.php/Color_Bash_Prompt

44
Michael Durrant

J'ai écrit une fonction bash qui peut vous montrer toutes les couleurs, si cela vous aide.

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
}

Vous pouvez jeter cela dans un .bashrc/.bash_profile/.bash_aliases ou l'enregistrer en tant que script et l'exécuter de cette façon. Vous pouvez utiliser les couleurs pour changer de couleur comme je l'ai fait avec mon nom ci-dessous.

sorties colorgrid (): Output of colorgrid()

J'ai changé mon nom dans mon .bash_profile en faisant ceci:

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 "

Notez que le préfixe 01 dans une chaîne comme \[\033[01;38;5;214m\]a le met en gras.

26
Plasmarob

Un autre script comme celui publié par TAFKA 'goldilocks' pour afficher les couleurs qui est peut-être un peu plus pratique à des fins de référence:

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

Cela devrait dimensionner correctement pour le terminal que vous utilisez. C'est un peu exagéré à cet effet, mais maintenant vous pouvez contrôler de nombreux aspects de la façon dont cela s'affiche via les paramètres. Espérons qu'ils soient tous explicites.

12
krowe
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\]
0
Ashish Rana