Personnaliser le prompt de Bash
Vous l’aurez sans doute remarqué, le prompt (invite de commande) de Bash n’est pas toujours des plus agréable selon le système sur lequel vous travaillez. Dans cet article nous verrons comment personnaliser le prompt de Bash pour le rentre à la fois plus esthétique mais aussi et surtout plus utile.
Introduction
Le prompt de Bash est conditionné par plusieurs variables d’environnement:
Variable | Description |
---|---|
PS0 | Texte affiché avant chaque sortie de commande |
PS1 | Contenu principal du prompt de Bash |
PS2 | Affichage secondaire du prompt, par exemple dans une commande multilignes. |
PS3 | Utilisée lors de l’exécution de la fonction intégrée select de Bash |
PS4 | Utilisée lors du debugging de scripts Bash |
La variable qui nous intéresse le plus ici est PS1 puisque c’est elle qui conditionne le contenu du prompt.
Pour cet article je me base sur une installation fraîche de Rocky Linux 8.8 installée avec un profil serveur dont le prompt de base est tout ce qu’il y a de plus minimaliste:
Si le prompt donne cet affichage, c’est tout simplement parce que la variable PS1 est définie de cette manière, nous pouvons en afficher la valeur avec la commande suivante:
echo $PS1
Ce qui sur mon système donne le résultat ci-dessous:
[steve@just-sudo-it ~]$ echo $PS1
[\u@\h \W]\$
[steve@just-sudo-it ~]$
Personnaliser le prompt de Bash
Pour personnaliser le prompt de Bash il nous « suffit » de redéfinir la variable PS1
. Commençons par analyser la valeur actuelle.
Variables de substitution
Tous les caractères préfixés d’un backslash (\
) sont des substitutions et permettent d’intégrer des informations du système. Par exemple, ici, \u
sera substitué par le nom de l’utilisateur, \h
par le nom d’ôte du système et \W
par le répertoire courant.
Voici une liste plus complètes (mais non exhaustive) de variables de substitutions utilisables dans le prompt:
Variable | Description |
---|---|
\d | La date au format ‘Jour Mois date’ (ex: dim. août 13). |
\h | Le nom d’hôte du système jusqu’au premier . (ex: just-do-it) |
\H | Le nom d’hôte complet du système (ex: just-do-it.linux.lab) |
\t | L’heure au format 24h HH:MM:SS. |
\T | L’heure au format 12h HH:MM:SS. |
\@ | L’heure au format 12j am/pm. |
\u | Le nom d’utilisateur. |
\w | Le nom du répertoire courant. |
\W | LE chemin du répertoire courant. |
\! | Le numéro d’historique de cette commande. |
\# | Le numéro de la commande (augmente ) chaque fois qu’on valide une commande. |
\$ | Insère « $ » si vous n’êtes pas root et « # » si vous l’êtes. |
\n | Insère une nouvelle ligne |
Redéfinir la variable « PS1 »
Modifier le prompt n’est vraiment pas compliqué, mais en cas d’erreur peut rendre l’utilisation de Bash assez pénible. Je vous conseille donc sérieusement de commander par conserver une copie de la valeur d’origine de la variable PS1
.
Notez que tant que nous travaillons de manière interactive, les modifications ne sont que temporaires et une fermeture et réouverture de session résoudra le moindre problème.
OLDPS1=$PS1
Grâce à cette manipulation nous pouvons à tout moment revenir à la version d’origine en effectuant l’opération inverse.
PS1=$OLDPS1
Maintenant que nous pris nos précautions, redéfinissons la variable PS1 à notre sauce:
PS1='\u@\h:\w\$'
Ce qui donnera le résultat ci-dessous:
[steve@just-sudo-it lib]$ PS1='\u@\h:\w\$ '
steve@just-sudo-it:/var/lib$
steve@just-sudo-it:/var/lib$
steve@just-sudo-it:/var/lib$
steve@just-sudo-it:/var/lib$
Vous pouvez ainsi décorer votre prompt à votre goût, que vous soyez plutôt minimaliste ou plutôt du genre à aimer les mises en forme. Voici un autre exemple un peu plus élaboré:
PS1='(\t) \u@\h:\w> '
Ce qui donnera l’invite de commande suivante:
[steve@just-sudo-it lib]$ PS1='(\t) \u@\h:\w> '
(16:19:11) steve@just-sudo-it:/var/lib>
(16:19:11) steve@just-sudo-it:/var/lib>
(16:19:11) steve@just-sudo-it:/var/lib>
Ajouter de la couleur
La plupart des terminaux modernes supportent l’affichage des couleurs. Il n’y a aucune raison pour que nous nous en privions surtout si ça rend le prompt plus lisible.
Pour ce faire nous devons utiliser des combinaisons de caractères spécifiques…
\e[code;code...m
Quelques explications sur cette structure pour le moins indigeste:
\e[
définit le point de départ de la coloration.code
est une valeur numérique qui définit le style, il peut y en avoir plusieurs séparés par;
m
termine l’instruction
Par exemple pour obtenir du texte blanc sur un fond rouge souligné, on utilisera le cade suivant:
\e[97;41;4m
Notez que le style appliqué le sera jusqu’au code qui l’annulera, par exemple \e[0m
annule tous les styles.
Codes de styles
Code | Description | Exemple |
---|---|---|
1 | Texte gras/brillant | \[1m |
2 | Texte atténué | \[2m |
4 | Texte souligné | \[4m |
5 | Texte clignotant | \[5m |
7 | Couleurs avant et arrière plan inversées | \[7m |
8 | Texte caché | \[8m |
Codes de couleur du texte
Code | Description | Exemle |
---|---|---|
39 | Couleur par défaut | \[39m |
30 | Noir | \[30m |
31 | Rouge | \[31m |
32 | Vert | \[32m |
33 | Jaune | \[33m |
34 | Bleu | \[34m |
35 | Magenta | \[35m |
36 | Cyan | \[36m |
37 | Gris clair | \[37m |
90 | Gris foncé | \[90m |
91 | Rouge pâle | \[91m |
92 | Vert pâle | \[92m |
93 | Jaune pâle | \[93m |
94 | Bleu pâle | \[94m |
95 | Magenta pâle | \[95m |
96 | Cyan pâle | \[96m |
97 | Blanc | \[97m |
Codes de couleur d’arrière-plan
Code | Description | Exemle |
---|---|---|
49 | Couleur par défaut | \[49m |
40 | Noir | \[40m |
41 | Rouge | \[41m |
42 | Vert | \[42m |
43 | Jaune | \[43m |
44 | Bleu | \[44m |
45 | Magenta | \[45m |
46 | Cyan | \[46m |
47 | Gris clair | \[47m |
100 | Gris foncé | \[100m |
101 | Rouge pâle | \[101m |
102 | Vert pâle | \[102m |
103 | Jaune pâle | \[103m |
104 | Bleu pâle | \[104m |
105 | Magenta pâle | \[105m |
106 | Cyan pâle | \[106m |
107 | Blanc | \[107m |
Codes d’interruption de style
Code | Description | Exemle |
---|---|---|
0 | Couleur par défaut | \[39m |
21 | Noir | \[30m |
22 | Rouge | \[31m |
24 | Vert | \[32m |
25 | Jaune | \[33m |
27 | Bleu | \[34m |
28 | Magenta | \[35m |
Tout ça fait beaucoup de codes, donc mieux vaut avoir une liste sous la main.
Notez que le rendu exact de la couleur peut varier d’un terminal à l’autre et qu’il est aussi possible d’utiliser plus de nuances de couleurs, tout dépend des capacité du terminal. Ici je me suis limité aux codes les plus courants.
Composer un prompt élaboré et coloré
Voici un exemple qui nous permettra de mieux comprendre le fonctionnement de ces codes.
PS1='\e[2m(\e[0m\e[93m\t\e[0;2m)\e[0m \e[94m\u\e[0;2m@\e[0;92m\h\e[0;2m:\e[0;91m\w\e[0;2>\e[0m '
Ce qui donne le prompt ci-dessous sur mon terminal:
Décomposons maintenant le code…
\e[2m(\e[0m\e[93m\t\e[0;2m)\e[0m
: l’affichage de l’heure\e[94m\u\e[0;2m@\e[0;92m\h
: l’affiche user:hostname\e[0;2m:\e[0;91m\w\e[0;2>\e[0m
: l’affichage du répertoire courant
Lorsque vous testez votre prompt, vous pouvez utiliser la fonction echo
pour afficher le résultat avant de redéfinir la variable PS1
.
echo -e '\e[31mHello \e[91mWorld \e[33m!\e[0m'
Modifier le prompt de manière permanente
Pour que la modification de votre prompt soit permanente, il suffit de l’inclure dans le fichier ~/.bashrc
. Certaines distributions ont déjà une valeur de PS1
définie comme c’est le cas pour Ubuntu par exemple.
Voici un autre exemple de prompt personnalisé…
PS1='\e[1;32m\u\e[2m@\e[22m\h\e[2m:\e[22m\e[01;34m\w\e[0m\$ '
Ce qui donne le résultat suivant:
Je peux maintenant le rendre permanent en ajoutant la ligne au fichier ~/.bashrc
.
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
# Personnalisation du prompt
export PS1='\e[1;32m\u\e[2m@\e[22m\h\e[2m:\e[22m\e[01;34m\w\e[0m\$'
La dernière ligne exporte la variable PS1
dans l’environnement à chaque chargement du fichier .bashrc
, c’est à dire à cuaque fois que Bash est lancé.
Pour appliquer les modifications je peux simplement demander l’interprétation du fichier .bashrc
(ou fermer la session et en ouvrir une nouvelle).
source ~/.bashrc
Conclusion
Travailler en ligne de commande ne nous oblige pas à exclure toute forme de confort ou d’agrément. Au même titre que la personnalisation de Bash avec des alias, personnaliser le prompt de Bash peut nous rendre la vie bien meilleure quand on passe des heures dans notre terminal.
0 Comments on “Personnaliser le prompt de Bash”