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

132

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 consulté Colorize Bash Console Color mais cela ne répondait pas à ma question sur une liste des codes réels.

Ce serait bien s'il y avait aussi une forme plus lisible.

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

Michael Durrant
la source
3
Notez que la finale \]ici ne fait en réalité pas partie de la séquence de couleurs; cela sert à définir précisément les invites (j'ai ajouté quelques paragraphes à la fin de ma réponse à ce sujet). "Ce serait bien s'il y avait aussi une forme plus lisible." -> le couper-coller dans votre propre réponse est un moyen de le faire.
goldilocks

Réponses:

174

Ce sont des séquences d'échappement ANSI ; Ce lien renvoie à 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

0réinitialise le terminal à ses paramètres par défaut (ce qui est probablement blanc). Le code réel pour le premier plan blanc est 37. En outre, l'accolade fermante à la fin ( \]) ne fait pas partie de la séquence de couleurs (voir les derniers paragraphes ci-dessous pour une explication de leur rôle dans la définition d'une invite).

Notez que certains terminaux graphiques vous permettent de spécifier un jeu de couleurs personnalisé. Cela affectera la sortie.

Il y a une liste ici qui ajoute 7 couleurs de premier plan et 7 couleurs de fond 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 graphique 256 couleurs (je pense que la plupart d’entre eux sont maintenant), vous pouvez appliquer les couleurs de ce tableau:

charte de couleurs xterm 256

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 tableau 1 telles qu’elles apparaissent sur votre terminal assez facilement:

#!/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-256colorsi vous êtes sur un terminal 256 couleurs via un 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 existe 256 couleurs et vous permettra d'ajouter quelque chose comme ceci à votre ~/.bashrc:

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

Attention, lorsque vous utilisez des séquences d'échappement de couleurs dans votre invite, vous devez les placer entre \crochets ( préfixés), comme suit:

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

Remarquez que l' [intérieur de la séquence de couleurs n'est pas échappé, mais ceux qui le sont sont. Ce dernier a pour but d’indiquer au shell que la séquence incluse ne compte pas dans la longueur de caractère de l’invite. Si ce compte est erroné, 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 plus revenir en arrière. il (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 fois que l'invite est utilisée (par opposition à une seule fois lorsque l'invite est définie), vous devez la définir en tant que 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 préférez utiliser les évasions spéciales \dou \D{format}rapides de bash - qui ne sont pas le sujet de la question, vous pouvez les trouver dans les man bashparagraphes suivants PROMPTING. Il existe diverses autres sorties utiles, telles que celles \wdu répertoire en cours, \ude l'utilisateur actuel, etc.


1. La partie principale de ce graphique, couleurs 16 à 231 (notez qu’elles ne sont pas numérotées), correspond à un cube de couleurs RVB de 6 x 6 x 6. "Cube de couleur" fait référence au fait qu'un espace colorimétrique RVB peut être représenté à l'aide d'un tableau tridimensionnel (un axe pour le rouge, un pour le vert et un pour le bleu). Ici, chaque couleur du cube peut être représentée sous forme de coordonnées dans un tableau de 6 x 6 x 6, et l'index dans le graphique est calculé comme suit:

    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 un 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"
boucle d'or
la source
1
Je suggère au demandeur original de tester la disponibilité des couleurs avec un tableau de test. Il y en a un ici: robmeerman.fr/unix/… ou il peut être très facile de le faire, si on ne fait pas confiance aux scripts shell trouvés sur Internet.
IBr
1
@IBr Point intéressant. Le simple fait de visualiser toutes les couleurs est une tâche simple et sans issue, aussi j’ai quelques lignes de bash pour le faire.
goldilocks
Le script de référence de couleur trouvé ici pourrait être plus utile, car il est compact tout en conservant les codes et en séparant chaque couleur pour plus de clarté.
Michael Plotke
1
S'il vous plaît, n'utilisez echorien d'autre qu'un texte littéral qui ne commence pas par un tiret ( -). C'est unportable. Toutes les implémentations courantes violent le standard qui stipule qu'aucune option ne doit être prise en charge. Pire, ils sont incompatibles. Vous devriez utiliser à la printfplace. (Et ne pas incorporer de variables dans les instructions printf, utilisez %s.)
nyuszika7h
2
colortest-256listez la palette xterm dans une belle forme compacte. ( apt-get install colortestsi manquant)
Volker Siegel
38

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

Michael Durrant
la source
2
Merci d'avoir enfin fourni des chaînes réellement utilisables.
Lbutlr
21

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

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 lancer cela dans un fichier .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 le faisais avec mon nom ci-dessous.

colorgrid () sorties: Sortie de colorgrid ()

J'ai changé mon nom dans mon fichier .bash_profile en procédant comme suit:

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 le \[\033[01;38;5;214m\]a définit en gras.

Plasmarob
la source
3
Je suis vraiment content d'avoir partagé cela. s’est avéré utile aujourd’hui pour que la configuration d’une base et d’un terminal soit moins hideuse. Je viens de voir la date aussi - ce sera il y a 2 ans demain.
Plasmarob
12

Un autre script comme celui posté par TAFKA "goldilocks" pour afficher des couleurs, ce 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 égard, mais vous pouvez maintenant contrôler de nombreux aspects de la façon dont cela s’affiche via des paramètres. Espérons qu'ils s'expliquent d'eux-mêmes.

Krowe
la source
1
Pas de tuer comme l'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
la source