Color Bash Prompt (Français)
From FrugalWiki
Dansk – Deutsch – English – Español – Français – Indonesia – Italiano – Lietuviškai – Magyar – Nederlands – Polski – Português – Română – Slovenský – Suomi – Svenska – Türkçe – Česky – Ελληνικά – Български – Русский – Српски – Українська – עברית – ไทย – 日本語 – 正體中文 – 简体中文 – 한국어
Il existe une multitude de possibilités pour personnaliser l'interpréteur de commande Bash (PS1) et le personnaliser pour gagner en efficacité dans l'exercice de la ligne de commande. Vous pouvez rajouter des informations supplémentaires à votre interpréteur de commande ou simplement ajouter de la couleur pour le rendre unique.
Contents |
Changements basiques
Les configurations suivantes sont utiles pour différencier l’administrateur (root) de l'utilisateur simple.
- Éditer votre fichier de configuration Bash:
- Commenter la ligne par défaut de l'interpréteur :
#PS1='[\u@\h \W]\$ '
- Ajouter la ligne suivante pour que vous utilisiez la couleur verte :
[chiri@zetsubou ~]$ _
PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\] '
- Éditer le fichier .bashrc de root (ou copier le depuis /etc/skel si le fichier n'est pas présent) :
# nano /root/.bashrc
- Ajouter la ligne suivante pour que root utilise la couleur rouge :
[root@zetsubou ~]# _
PS1='\[\e[1;31m\][\u@\h \W]\$\[\e[0m\] '
Améliorations
- Un interpréteur vert et bleu pour les utilisateurs standards :
chiri ~/docs $ echo "sample output text"
sample output text
chiri ~/docs $ _
PS1='\[\e[0;32m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[1;32m\]\$\[\e[m\] \[\e[1;37m\]'
Cela donnera un résultat agréable et coloré avec le texte en blanc.
Les chaînes ci-dessus contiennent des symboles d'accueil ( la coloration commence par : \[\e[color\], et se termine avec \[\e[m\] ) et des informations sur l'utilisateur :
- \u - Nom de l'utilisateur. L'interpréteur original à aussi \h qui affiche le nom du domaine.
- \w - La position absolue actuelle. Utilisez \W pour la position relative actuelle.
- \$ - Le caractère de l’interpréteur ('#' pour root et '$' pour les utilisateurs standards).
La dernière séquence de coloration, "\[\e[1;37m\]", n'est pas fermé, aussi le texte qui suivra (tout ce qui écrit dans le terminal, la sortie des programmes, etc) apparaîtra dans cette couleur. Il est conseillé de changer cette couleur, ou d'effacer le dernier symbole d'accueil pour laisser la sortie actuelle dans la couleur par défaut.
- Un interpréteur rouge et bleu pour root:
root ~/docs # echo "sample output text"
sample output text
root ~/docs # _
PS1='\[\e[0;31m\]\u\[\e[m\] \[\e[1;34m\]\w\[\e[m\] \[\e[0;31m\]\$ \[\e[m\]\[\e[0;32m\]'
Cela donnera un rendu rouge et un texte vert.
Changements avancés
Statut de la mémoire pour les terminaux 256 couleurs
Cet exemple provient de l'article BASH Power Prompt de AskApache.com . Il est très utile pour ceux qui souhaitent comprendre les terminaux 256 couleurs comme ncurses, termcap et terminfo.
802/1024MB 1.28 1.20 1.13 3/94 18563
[5416:17880 0:70] 05:35:50 Wed Apr 21 [srot@host.sqpt.net:/dev/pts/0 +1] ~
(1:70)$ _
PROMPT_COMMAND='history -a;echo -en "\033[m\033[38;5;2m"$(( `sed -nu "s/MemFree:[\t ]\+\([0-9]\+\) kB/\1/p" /proc/meminfo`/1024))"\033[38;5;22m/"$((`sed -nu "s/MemTotal:[\t ]\+\([0-9]\+\) kB/\1/Ip" /proc/meminfo`/1024 ))MB"\t\033[m\033[38;5;55m$(< /proc/loadavg)\033[m"' PS1='\[\e[m\n\e[1;30m\][$$:$PPID \j:\!\[\e[1;30m\]]\[\e[0;36m\] \T \d \[\e[1;30m\][\[\e[1;34m\]\u@\H\[\e[1;30m\]:\[\e[0;37m\]${SSH_TTY} \[\e[0;32m\]+${SHLVL}\[\e[1;30m\]] \[\e[1;37m\]\w\[\e[0;37m\] \n($SHLVL:\!)\$ '
Liste des couleurs pour l'interpréteur
Ajouter ceci à votre fichier Bash pour définir les couleurs pour l'interpréteur et les commandes:
txtblk='\e[0;30m' # Noir - normal txtred='\e[0;31m' # Rouge txtgrn='\e[0;32m' # Vert txtylw='\e[0;33m' # Jaune txtblu='\e[0;34m' # Bleu txtpur='\e[0;35m' # Violet txtcyn='\e[0;36m' # Cyan txtwht='\e[0;37m' # Blanc bldblk='\e[1;30m' # Noir - gras bldred='\e[1;31m' # Rouge bldgrn='\e[1;32m' # Vert bldylw='\e[1;33m' # Jaune bldblu='\e[1;34m' # Bleu bldpur='\e[1;35m' # Violet bldcyn='\e[1;36m' # Cyan bldwht='\e[1;37m' # Blanc unkblk='\e[4;30m' # noir - souligne undred='\e[4;31m' # Rouge undgrn='\e[4;32m' # Vert undylw='\e[4;33m' # Jaune undblu='\e[4;34m' # Bleu undpur='\e[4;35m' # Violet undcyn='\e[4;36m' # Cyan undwht='\e[4;37m' # Blanc bakblk='\e[40m' # Noir - fond bakred='\e[41m' # Rouge badgrn='\e[42m' # Vert bakylw='\e[43m' # Jaune bakblu='\e[44m' # Bleu bakpur='\e[45m' # Violet bakcyn='\e[46m' # Cyan bakwht='\e[47m' # Blanc txtrst='\e[0m' # Réinitialisation du texte
Ou si vous préférez avoir le nom des couleurs normales et des effets d'intensités :
# Réinitialisation Color_Off='\e[0m' # Réinitialisation du texte # Couleurs normales Black='\e[0;30m' # Noir Red='\e[0;31m' # Rouge Green='\e[0;32m' # Vert Yellow='\e[0;33m' # Jaune Blue='\e[0;34m' # Bleu Purple='\e[0;35m' # Violet Cyan='\e[0;36m' # Cyan White='\e[0;37m' # Blanc # Gras BBlack='\e[1;30m' # Noir BRed='\e[1;31m' # Rouge BGreen='\e[1;32m' # Vert BYellow='\e[1;33m' # Jaune BBlue='\e[1;34m' # Bleu BPurple='\e[1;35m' # Violet BCyan='\e[1;36m' # Cyan BWhite='\e[1;37m' # Blanc # Souligne UBlack='\e[4;30m' # Noir URed='\e[4;31m' # Rouge UGreen='\e[4;32m' # Vert UYellow='\e[4;33m' # Jaune UBlue='\e[4;34m' # Bleu UPurple='\e[4;35m' # Violet UCyan='\e[4;36m' # Cyan UWhite='\e[4;37m' # Blanc # Fond On_Black='\e[40m' # Noir On_Red='\e[41m' # Rouge On_Green='\e[42m' # Vert On_Yellow='\e[43m' # Jaune On_Blue='\e[44m' # Bleu On_Purple='\e[45m' # Violet On_Cyan='\e[46m' # Cyan On_White='\e[47m' # Blanc # Haute intensite IBlack='\e[0;90m' # Noir IRed='\e[0;91m' # Rouge IGreen='\e[0;92m' # Vert IYellow='\e[0;93m' # Jaune IBlue='\e[0;94m' # Bleu IPurple='\e[0;95m' # Violet ICyan='\e[0;96m' # Cyan IWhite='\e[0;97m' # Blanc # Haute intensite - gras BIBlack='\e[1;90m' # Noir BIRed='\e[1;91m' # Rouge BIGreen='\e[1;92m' # Vert BIYellow='\e[1;93m' # Jaune BIBlue='\e[1;94m' # Bleu BIPurple='\e[1;95m' # Violet BICyan='\e[1;96m' # Cyan BIWhite='\e[1;97m' # Blanc # Haute intensite - fond On_IBlack='\e[0;100m' # Noir On_IRed='\e[0;101m' # Rouge On_IGreen='\e[0;102m' # Vert On_IYellow='\e[0;103m' # Jaune On_IBlue='\e[0;104m' # Bleu On_IPurple='\e[10;95m' # Violet On_ICyan='\e[0;106m' # Cyan On_IWhite='\e[0;107m' # Blanc
Pour utiliser ces commandes dans votre environnement shell :
$ echo -e "${txtblu}test"
test
$ echo -e "${bldblu}test"
test
$ echo -e "${undblu}test"
test
$ echo -e "${bakblu}test"
test
Pour l'utiliser dans l'interpréteur (attention aux guillemets et aux \[ \] utilisés par le shell pour avoir la bonne syntaxe):
PS1="\[$txtblu\]foo\[$txtred\] bar\[$txtrst\] baz : "
Symboles d'accueil
Les nombreux symboles de l'interpréteur Bash listés dans le manuel : Quand il est exécuté de manière interactive, bash affiche le symbole d'accueil principal
PS1 dès qu'il est prêt à lire une commande, et le symbole d'accueil secondaire PS2 quand il a besoin de plus de données pour exécuter une commande. Bash permet de personnaliser ces chaînes d'accueil, avec des séquences d'échappement ayant les significations suivantes : \a le caractère d'alarme ASCII 07 \d la date au format "Jour_de_la_semaine Mois Quantième" (ex : "Tue May 26") \e le caractère d'échappement ASCII 033 \h le nom d'hôte de la machine, jusqu'au premier point `.' \H le nom d'hôte complet de la machine \n un saut de ligne \r un retour-chariot \s le nom du shell, c'est-à-dire le nom de base de $0 (la portion suivant le dernier slash) \t l'heure actuelle au format HH:MM:SS sur 24 heures \T l'heure actuelle au format HH:MM:SS sur 12 heures \@ l'heure actuelle sur 12 heures au format HH:MM am/pm \u le nom de l'utilisateur \v la version de bash (par exemple 2.04) \V le numéro de version complet de bash par exemple (2.04.0) \w le répertoire de travail en cours \W le nom de base du répertoire de travail en cours \! le numéro d'historique de la commande \# le numéro de la commande \$ # si l'UID effectif est 0, $ sinon \nnn le caractère de code octal nnn \\ le caractère antislash \[ débute une série de caractères non-imprimables, qui permettent d'inclure des séquences de contrôle de terminal dans une chaîne d'accueil \] fin d'une série de caractères non-imprimables Le numéro de commande, et le numéro d'historique sont généralement différents : le numéro d'historique d'une commande correspond à sa position dans la liste d'historique qui peut contenir des commandes relues depuis cette liste (voir le paragraphe HISTORIQUE plus bas), alors que le numéro de commande est simplement une position dans la séquence de commandes exécutées depuis le début de la session shell actuelle. Après que la chaîne d'invite ait été décodée, elle est soumise à l'expansion des paramètres, substitution de commandes, évaluation arithmétique et découpage des mots, sous condition de l'option shell promptvars (voir la description de shopt au paragraphe FONCTIONS INTERNES DU SHELL plus bas).
Positionner le curseur
La commande suivante définie la position du curseur :
\[\033[<row>;<column>f\]
La position actuelle peut être sauvegardée en utilisant :
\[\033[s\]
Pour restaurer une position, utilisez la commande suivante :
\[\033[u\]
L'exemple suivant utilise ces commandes pour afficher l'heure dans le coin supérieur droit :
PS1=">\[\033[s\]\[\033[1;\$((COLUMNS-4))f\]\$(date +%H:%M)\[\033[u\]"
La variable d'environnement COLUMNS contient le nombre de colonnes du terminal. L'exemple du dessus retire 4 à cette valeur pour permettre l'affichage des cinq caractères utilisés pour la date sur le bord droit.
Visualiser la dernière valeur retournée
WARNING WARNING WARNING WARNING
This seemed to me to have some bugs, see the entry I added to the discussion page.
Ajouter cette ligne si vous souhaitez voir la valeur retournée par la dernière commande exécutée. Cela devrait fonctionner avec n'importe quel type de commande tant qu'il n'utilise pas PROMPT_COMMAND:
PROMPT_COMMAND='RET=$?; if [[ $RET -eq 0 ]]; then echo -ne "\033[0;32m$RET\033[0m ;)"; else echo -ne "\033[0;31m$RET\033[0m ;("; fi; echo -n " "'
Cela ressemble à ça:
0 ;) harvie@harvie-ntb ~/ $ true 0 ;) harvie@harvie-ntb ~/ $ false 1 ;( harvie@harvie-ntb ~/ $
Le zéro est vert et le reste rouge. Il y a aussi le smiley (remplacez les par ceux que vous souhaitez) d'indications qui sourit si la dernière opération c'est bien passé.
Visualisation avancée
Si vous souhaitez des couleurs, vous devez spécifier les valeurs de $RED et $GREEN:
RED='\e[0;31m' GREEN='\e[0;32m'
Vous avez à spécifier ces valeurs dans le fichier de configuration de l'interpréteur Bash:
#return value visualisation PROMPT_COMMAND='RET=$?;' RET_VALUE='$(echo $RET)' #Ret value not colorized - you can modify it. RET_SMILEY='$(if [[ $RET = 0 ]]; then echo -ne "\[$GREEN\];)"; else echo -ne "\[$RED\];("; fi;)'
Vous pouvez aussi utiliser les variables $RET_VALUE et $RET_SMILEY dans l'interpréteur. Note, vous devez utiliser les guillemets :
#prompt PS1="$RET_VALUE $RET_SMILEY : "
Cela vous donnera:
0 ;) : true 0 ;) : false 1 ;( :
Mais vous pourrez utiliser $RET_VALUE ou $RET_SMILEY dans votre interpréteur, de cette manière:
PS1="\[$WHITE\]$RET_VALUE $RET_SMILEY \[$BLUE\]\u\[$RED\]@\[$EBLUE\]\h\[$WHITE\] \W \[$ERED\]\\$\[$EWHITE\] "
Exemple de Wolfman
Cet auteur a développé un interpréteur de commande qui affiche les 15 derniers caractères du répertoire de travail actuel. Cet exemple fonctionne mieux avec des terminaux à fond blanc. Le code suivant se met dans le fichier ~/.bashrc.
- Ajouter cette fonction. Si vous avez des noms de répertoires longs ou que vous commencez à obtenir de nombreux sous-répertoires, cette fonction va permettre de n'afficher que les pwdmaxlen caractères du chemin. Ce code provient de Controller la taille et l'apparence du $PWD du Bash Prompt Howto et à été modifié pour remplacer le chemin du répertoire personnel de l'utilisateur par un tilde.
################################################## # Fancy PWD display function ################################################## # The home directory (HOME) is replaced with a ~ # The last pwdmaxlen characters of the PWD are displayed # Leading partial directory names are striped off # /home/me/stuff -> ~/stuff if USER=me # /usr/share/big_dir_name -> ../share/big_dir_name if pwdmaxlen=20 ################################################## bash_prompt_command() { # How many characters of the $PWD should be kept local pwdmaxlen=25 # Indicate that there has been dir truncation local trunc_symbol=".." local dir=${PWD##*/} pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen )) NEW_PWD=${PWD/#$HOME/\~} local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen )) if [ ${pwdoffset} -gt "0" ] then NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen} NEW_PWD=${trunc_symbol}/${NEW_PWD#*/} fi }
- Cet extrait génère la ligne de l'interpréteur et défini les couleurs. Le nom de l'utilisateur, le domaine et le symbole de l'interpréteur ($ ou #) seront en cyan, et si l'utilisateur est root (l'UID de root est toujours 0), ils seront en rouge.
- Vérifiez que les variables de couleurs sont écrites avec des guillemets et non de simples quotes. Utiliser les simples quotes peut causer des problèmes avec des lignes qui ne s'affichent pas correctement.
bash_prompt() { case $TERM in xterm*|rxvt*) local TITLEBAR='\[\033]0;\u:${NEW_PWD}\007\]' ;; *) local TITLEBAR="" ;; esac local NONE="\[\033[0m\]" # unsets color to term's fg color # regular colors local K="\[\033[0;30m\]" # black local R="\[\033[0;31m\]" # red local G="\[\033[0;32m\]" # green local Y="\[\033[0;33m\]" # yellow local B="\[\033[0;34m\]" # blue local M="\[\033[0;35m\]" # magenta local C="\[\033[0;36m\]" # cyan local W="\[\033[0;37m\]" # white # emphasized (bolded) colors local EMK="\[\033[1;30m\]" local EMR="\[\033[1;31m\]" local EMG="\[\033[1;32m\]" local EMY="\[\033[1;33m\]" local EMB="\[\033[1;34m\]" local EMM="\[\033[1;35m\]" local EMC="\[\033[1;36m\]" local EMW="\[\033[1;37m\]" # background colors local BGK="\[\033[40m\]" local BGR="\[\033[41m\]" local BGG="\[\033[42m\]" local BGY="\[\033[43m\]" local BGB="\[\033[44m\]" local BGM="\[\033[45m\]" local BGC="\[\033[46m\]" local BGW="\[\033[47m\]" local UC=$W # user's color [ $UID -eq "0" ] && UC=$R # root's color PS1="$TITLEBAR ${EMK}[${UC}\u${EMK}@${UC}\h ${EMB}\${NEW_PWD}${EMK}]${UC}\\$ ${NONE}" # without colors: PS1="[\u@\h \${NEW_PWD}]\\$ " # extra backslash in front of \$ to make bash colorize the prompt }
- Finalement, ajouter ce code. Il sert à mettre à jour la variable NEW_PWD quand vous vous déplacer quelque part (avec cd) de la variable PS1.
PROMPT_COMMAND=bash_prompt_command bash_prompt unset bash_prompt
Exemple de KitchM
Cet exemple offre une meilleure clarté d'affichage. Note, l'utilisation du rouge dans l'interpréteur de l'utilisateur root peut provoquer des warnings.
Premièrement, changer le fond par défaut dans les préférences de votre terminal (cet exemple utilise le terminal de Xfce) en #D2D2D2, et la couleur du texte en #000000. La police de caractère est la DejaVu Sans Mono Book 12. La couleur du curseur est #00AA00, et les onglets actifs en #AF0000.
Deuxièmement, dans ~/.bashrc et après la ligne PS1=, entrer la nouvelle ligne :
PS1='\e[1;33;47m\u \e[1;32;47mon \h \e[1;35;47m\d \@\e[0;0m\n\e[1;34m[dir.= \w] \# > \e[0;0m'
Et placer un # devant la première ligne PS1 pour la désactiver.
Troisièmement, pour l'utilisateur root, éditer /root/.bashrc de la même manière en ajoutant:
PS1='\e[1;31;47m\u \e[1;32;47mon \h \e[1;35;47m\d \@\e[0;0m\n\e[1;31m[dir.= \w] \# > \e[0;0m'
Ne pas oublier de commenter avec # l'ancienne ligne.
C'est un interpréteur à deux lignes et elles ressemblent à ceci :
Pour l'utilisateur standard-
Username on myhost Sun Jan 15 12:30 PM [dir.= /home/username] 1 >
Pour l'utilisateur root-
Root on myhost Sun Jan 15 12:30 PM [dir.= /etc/rc.d] 1 >
Vous pouvez noter que la couleur de fond rend le texte simple à lire et les couleurs de texte rendent le visuel intéressant. Il existe de nombreuses possibilités de personnalisation, juste en utilisant les couleurs.
Changer le titre de la fenêtre
Xterm et d'autres émulateurs de terminal (incluant PuTTY) vous permette de changer le titre du terminal en utilisant les commandes d'échappements. Vous pouvez définir la variable ${XTERM_TITLE} comme suit, puis l’insérer au début de l'interpréteur pour changer le titre du xterm (si disponible) en directory@user@hostname:
#set xterm title case "$TERM" in xterm | xterm-color) XTERM_TITLE='\[\e]0;\W@\u@\H\a\]' ;; esac
Le texte entre 0;
et \a
peut être changer comme vous le souhaitez, par exemple:
export PS1='\[\e]0;Welcome to ArchLinux\a\]\$>> '
Change le titre de la fenêtre en "Welcome to ArchLinux" puis affiche cette simple ligne:
$>> _
Différentes couleurs pour les textes et les sorties consoles
Si vous ne réinitialisez pas la couleur du texte à la fin de votre interpréteur, le texte que vous insérerez dans le terminal restera dans cette couleur. Si vous souhaitez éditer un texte dans une couleur spéciale mais que vous utilisez toujours la couleur par défaut de l'interpréteur, vous devez la réinitialiser après avoir appuyé sur Entrée et avant d'exécuter une commande quelconque. Vous pouvez le faire en placant un débogueur dans votre ~/.bashrc, comme ça :
trap 'echo -ne "\e[0m"' DEBUG
Exemple de bashrc provenant de Gentoo
# /etc/bash.bashrc # # This file is sourced by all *interactive* bash shells on startup, # including some apparently interactive shells such as scp and rcp # that can't tolerate any output. So make sure this doesn't display # anything or bad things will happen ! # Test for an interactive shell. There is no need to set anything # past this point for scp and rcp, and it's important to refrain from # outputting anything in those cases. if [[ $- != *i* ]] ; then # Shell is non-interactive. Be done now! return fi # Bash won't get SIGWINCH if another process is in the foreground. # Enable checkwinsize so that bash will check the terminal size when # it regains control. #65623 # http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11) shopt -s checkwinsize # Enable history appending instead of overwriting. #139609 shopt -s histappend # Change the window title of X terminals case ${TERM} in xterm*|rxvt*|Eterm|aterm|kterm|gnome*|interix) PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\007"' ;; screen) PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\033\\"' ;; esac use_color=false # Set colorful PS1 only on colorful terminals. # dircolors --print-database uses its own built-in database # instead of using /etc/DIR_COLORS. Try to use the external file # first to take advantage of user additions. Use internal bash # globbing instead of external grep binary. safe_term=${TERM//[^[:alnum:]]/?} # sanitize TERM match_lhs="" [[ -f ~/.dir_colors ]] && match_lhs="${match_lhs}$(<~/.dir_colors)" [[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(</etc/DIR_COLORS)" [[ -z ${match_lhs} ]] \ && type -P dircolors >/dev/null \ && match_lhs=$(dircolors --print-database) [[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true if ${use_color} ; then # Enable colors for ls, etc. Prefer ~/.dir_colors #64489 if type -P dircolors >/dev/null ; then if [[ -f ~/.dir_colors ]] ; then eval $(dircolors -b ~/.dir_colors) elif [[ -f /etc/DIR_COLORS ]] ; then eval $(dircolors -b /etc/DIR_COLORS) fi fi if [[ ${EUID} == 0 ]] ; then PS1='\[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] ' else PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] ' fi alias ls='ls --color=auto' alias grep='grep --colour=auto' else if [[ ${EUID} == 0 ]] ; then # show root@ when we don't have colors PS1='\u@\h \W \$ ' else PS1='\u@\h \w \$ ' fi fi # Try to keep environment pollution down, EPA loves us. unset use_color safe_term match_lhs