Personnaliser le prompt de Bash
Personnaliser Bash

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:

VariableDescription
PS0Texte affiché avant chaque sortie de commande
PS1Contenu principal du prompt de Bash
PS2Affichage secondaire du prompt, par exemple dans une commande multilignes.
PS3Utilisée lors de l’exécution de la fonction intégrée select de Bash
PS4Utilisée lors du debugging de scripts Bash
Variables d’environnement relatives au prompt de 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:

Prompt de base sous Rocky Linux 8.8

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:

Afficher le contenu de la variable PS1
echo $PS1

Ce qui sur mon système donne le résultat ci-dessous:

Résultat
[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:

VariableDescription
\dLa date au format ‘Jour Mois date’ (ex: dim. août 13).
\hLe nom d’hôte du système jusqu’au premier . (ex: just-do-it)
\HLe nom d’hôte complet du système (ex: just-do-it.linux.lab)
\tL’heure au format 24h HH:MM:SS.
\TL’heure au format 12h HH:MM:SS.
\@L’heure au format 12j am/pm.
\uLe nom d’utilisateur.
\wLe nom du répertoire courant.
\WLE 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.
\nInsè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.

Copier la contenu de PS1 dans la variable OLDPS1.
OLDPS1=$PS1

Grâce à cette manipulation nous pouvons à tout moment revenir à la version d’origine en effectuant l’opération inverse.

Restaurer l’ancienne version de la variable PS1
PS1=$OLDPS1

Maintenant que nous pris nos précautions, redéfinissons la variable PS1 à notre sauce:

Définir la structure du prompt avec la variable PS1
PS1='\u@\h:\w\$'

Ce qui donnera le résultat ci-dessous:

Modification de la variable PS1
[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é:

Définition d’un prompt plus élaboré
PS1='(\t) \u@\h:\w> '

Ce qui donnera l’invite de commande suivante:

Un prompt un peu plus élaboré
[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…

Structure de la coloration du prompt
\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:

Texte blanc souligné sur fond rouge
\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

CodeDescriptionExemple
1Texte gras/brillant\[1m
2Texte atténué\[2m
4Texte souligné\[4m
5Texte clignotant\[5m
7Couleurs avant et arrière plan inversées\[7m
8Texte caché\[8m

Codes de couleur du texte

CodeDescriptionExemle
39Couleur par défaut\[39m
30Noir\[30m
31Rouge\[31m
32Vert\[32m
33Jaune\[33m
34Bleu\[34m
35Magenta\[35m
36Cyan\[36m
37Gris clair\[37m
90Gris foncé\[90m
91Rouge pâle\[91m
92Vert pâle\[92m
93Jaune pâle\[93m
94Bleu pâle\[94m
95Magenta pâle\[95m
96Cyan pâle\[96m
97Blanc\[97m

Codes de couleur d’arrière-plan

CodeDescriptionExemle
49Couleur par défaut\[49m
40Noir\[40m
41Rouge\[41m
42Vert\[42m
43Jaune\[43m
44Bleu\[44m
45Magenta\[45m
46Cyan\[46m
47Gris clair\[47m
100Gris foncé\[100m
101Rouge pâle\[101m
102Vert pâle\[102m
103Jaune pâle\[103m
104Bleu pâle\[104m
105Magenta pâle\[105m
106Cyan pâle\[106m
107Blanc\[107m

Codes d’interruption de style

CodeDescriptionExemle
0Couleur par défaut\[39m
21Noir\[30m
22Rouge\[31m
24Vert\[32m
25Jaune\[33m
27Bleu\[34m
28Magenta\[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.

Un prompt élabré et coloré
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:

Prompt Bash personnalisé

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.

Affiche le texte avec l’interprétation des couleurs
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é…

Prompt coloré inspiré de celui d’Ubuntu
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:

Prompt Bash inspiré du modèle de base d'Ubuntu.

Je peux maintenant le rendre permanent en ajoutant la ligne au fichier ~/.bashrc.

~/.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).

Forcer l’interprétation de .bashrc
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

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.