CyberSDF

Reprenez la main sur votre numérique

Personnaliser le prompt bash : lisible, coloré, réversible

Pour personnaliser votre prompt bash, vous modifiez la variable PS1, que bash interprète à chaque invite : \\u pour l’utilisateur, \\h pour la machine, \\w pour le répertoire courant. Testez d’abord dans la session ouverte, puis écrivez le résultat dans ~/.bashrc pour le rendre permanent. Aucun droit d’administration n’est nécessaire, et une copie du fichier suffit à revenir en arrière. Pour situer ce réglage parmi les gestes du shell, consultez la page qui aide à choisir un geste du shell.

Sommaire
  1. Où bash lit-il le prompt que vous voyez ?
  2. Quels raccourcis peut-on mettre dans un prompt ?
  3. Comment tester un prompt sans toucher à vos fichiers ?
  4. Comment colorer le prompt proprement ?
  5. Comment écrire la modification dans un fichier et la rendre réversible ?
  6. ~/.bashrc ou ~/.profile : que mettre où ?
  7. Quand un prompt « clé en main » coûte-t-il plus qu’il ne rapporte ?
  8. Comment revenir à l’état initial ?
  9. Le prompt Bash a-t-il déjà été documenté ailleurs ?
  10. Repères pour aller plus loin
Terminal affichant une invite Bash colorée avec le chemin du répertoire courant.

Aucune installation nécessaire : la méthode n’utilise que bash, son fichier de configuration et la page de manuel bash. Les sorties citées sont celles vraiment affichées par bash 5.2.21, observées dans un pseudo-terminal ; pour la publication, les noms d’utilisateur et de machine ont été remplacés par un exemple neutre, les séquences et leur rendu sont reproduits tels quels.

Où bash lit-il le prompt que vous voyez ?

Bash distingue plusieurs invites, et la page de manuel bash les définit précisément :

L’invite principale est définie à deux endroits, et cela dépend du type de session :

Le fichier livré par défaut montre les deux niveaux. Le fichier système définit une invite sans couleur :

PS1='${debian_chroot:+($debian_chroot)}\\u@\\h:\\w\\$ '

Puis ~/.bashrc, livré dans le modèle utilisateur, propose une version colorée, conditionnée à la couleur réelle du terminal :

if [ \\"$color_prompt\\" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\\[\\033[01;32m\\]\\u@\\h\\[\\033[00m\\]:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\\u@\\h:\\w\\$ '
fi
unset color_prompt force_color_prompt

Deux détails se voient dans ce bloc : la variable force_color_prompt est commentée par défaut (la consigne livrée dit explicitement que la couleur est désactivée pour ne pas distraire l’utilisateur), et la couleur n’est activée que si tput setaf 1 répond, une vérification de capacité du terminal, pas une supposition.

Une observation utile : si vous lancez bash avec l’option --norc, aucun de ces fichiers n’est lu, et bash retombe sur une invite minimale. Mesuré ici :

bash-5.2$ echo cas-ok

Autrement dit, l’invite que vous voyez vient bien des fichiers de configuration, et non du programme lui-même.

Quels raccourcis peut-on mettre dans un prompt ?

Les séquences reconnues sont listées dans la section PROMPTING de la page de manuel bash. Les plus utiles :

Séquence Ce qu’elle affiche
\\u le nom de l’utilisateur courant
\\h le nom de la machine, jusqu’au premier point
\\H le nom de la machine complet
\\w le répertoire courant, avec $HOME abrégé en ~
\\W le seul nom du répertoire courant
\\d la date, au format « jour mois date »
\\t l’heure en 24 h, format HH:MM:SS
\\# le numéro de commande depuis l’ouverture de la session
\\! le numéro d’historique
\\$ # si l’utilisateur est root, $ sinon
\\[ \\] délimitent une séquence non imprimable (couleur, contrôle)

Deux compléments méritent d’être connus, car ils évitent des prompts illisibles dans les chemins profonds :

Comment tester un prompt sans toucher à vos fichiers ?

Dans le terminal déjà ouvert, écrivez simplement la nouvelle valeur. Elle s’applique à l’invite suivante, et disparaît à la fermeture de la session : rien n’est écrit sur le disque.

Voici trois essais réellement exécutés avec bash 5.2.21 :

PS1='\\u@\\h:\\w\\$ '
camille@atelier:/home/camille/projets$ echo cas-ok\ncas-ok

Puis la version courte, qui n’affiche que le dernier dossier :

PS1='[\\u@\\h \\W]\\$ '
[camille@atelier projets]$ echo cas-ok\ncas-ok

Le \\$ affiche $ pour un utilisateur ordinaire et # pour root : c’est un rappel permanent de vos droits au moment où vous tapez la commande, ce qui n’est pas un détail quand on travaille dans plusieurs fenêtres.

Un point d’attention : ces essais modifient votre invite pour la session courante. Si vous collez une valeur par erreur et que le résultat est illisible, fermez le terminal : la session suivante revient à l’invite définie dans vos fichiers.

Comment colorer le prompt proprement ?

La difficulté n’est pas de choisir une couleur, c’est d’empêcher bash de mal compter la largeur de l’invite. \\[ et \\] existent exactement pour cette : ils signalent le début et la fin d’une séquence non imprimable. Sans eux, les caractères de contrôle sont comptés comme des caractères visibles, et le curseur comme l’historique se décalent.

Voici la forme livrée par défaut, essayée telle quelle :

PS1='\\[\\033[01;32m\\]\\u@\\h\\[\\033[00m\\]:\\[\\033[01;34m\\]\\w\\[\\033[00m\\]\$ '

Les octets réellement émis par bash pour cette invite sont les suivants (observés dans un pseudo-terminal) :

\\x1b[01;32mcamille@atelier\\x1b[00m:\\x1b[01;34m/home/camille/projets\\x1b[00m$ 

Trois choses s’y lisent :

Le fichier livré par défaut fournit déjà la logique de décision. Plutôt que de forcer la couleur, vous pouvez décommenter la ligne prévue :

force_color_prompt=yes

Elle est suivie de la vérification tput setaf 1 évoquée plus haut, puis du choix entre les deux invites. C’est une manière de garder votre configuration lisible : une seule variable à modifier, et le comportement de repli reste en place pour un terminal sans couleur.

Comment écrire la modification dans un fichier et la rendre réversible ?

Trois gestes, dans cet ordre.

1. Sauvegardez le fichier avant de le modifier. C’est ce qui rend l’opération réversible, et cela prend une seconde :

cp ~/.bashrc ~/.bashrc.avant-prompt-$(date +%F)

2. Ajoutez un bloc à la fin de ~/.bashrc. La fin du fichier est le bon endroit : votre valeur écrasera celles définies plus haut, sans que vous ayez à modifier le bloc livré par le système.

PS1='[\\u@\\h \\W]\\$ '

Gardez les guillemets simples. La page de manuel précise que la chaîne est décodée, puis développée par bash (substitution de paramètres, substitution de commandes, expansion arithmétique) : avec des guillemets doubles, votre invite serait développée au moment de l’affectation, pas à chaque affichage.

3. Rechargez le fichier et vérifiez. Deux commandes, dont une qui vérifie la syntaxe sans rien exécuter :

bash -n ~/.bashrc\n. ~/.bashrc

bash -n lit le fichier et signale les erreurs de syntaxe sans exécuter le contenu. La seconde ligne l’exécute dans la session courante ; votre nouvelle invite doit apparaître immédiatement. Si elle ne change pas, lisez le message renvoyé : le plus souvent, un espace manquant après PS1=.

Aucun sudo n’est nécessaire ici : ~/.bashrc appartient à votre compte, et cette configuration ne concerne que vous.

~/.bashrc ou ~/.profile : que mettre où ?

Les deux fichiers n’ont pas le même rôle, et les confondre produit des configurations qui marchent dans un cas et pas dans l’autre.

Sur un système Debian ou Ubuntu, le fichier ~/.profile livré par défaut contient déjà ce passage :

if [ -n \\"$BASH_VERSION\\" ]; then
    if [ -f \\"$HOME/.bashrc\\" ]; then
        . \\"$HOME/.bashrc\\"
    fi
fi

Autrement dit, une session connectée finit par lire votre ~/.bashrc. Vous pouvez donc écrire votre prompt à un seul endroit, et ne pas le dupliquer dans ~/.profile : deux définitions de PS1 rendent la lecture difficile le jour où l’invite ne ressemble plus à ce que vous attendez.

Le fichier ~/.bashrc livré par défaut prévoit aussi, s’il existe, un fichier ~/.bash_aliases pour vos alias. Séparer les alias de la configuration du prompt est une bonne habitude si vous modifiez l’un des deux souvent.

Quand un prompt « clé en main » coûte-t-il plus qu’il ne rapporte ?

Il existe des projets qui remplacent entièrement votre invite : Starship, Oh-My-Bash, Powerline, et d’autres. Ce ne sont pas de mauvais outils. Mais avant de les installer, posez-vous la question du coût réel :

La ligne de partage est simple : si vous voulez changer deux caractères, deux lignes dans ~/.bashrc suffisent, et la méthode qui suit les documente. Si vous voulez un affichage qui se recalcule en permanence, un framework peut se justifier, à condition de vérifier, avant de l’installer, ce qu’il écrit dans vos fichiers et comment le retirer.

Ce qui est déconseillé ici est précisément l’inverse : copier un bloc d’invite trouvé quelque part sans savoir ce qu’il exécute. Une invite est une commande que bash lance à chaque appui sur Entrée.

Comment revenir à l’état initial ?

Deux méthodes, selon ce que vous avez modifié.

Si vous avez suivi la sauvegarde proposée plus haut :

cp ~/.bashrc.avant-prompt-$(date +%F) ~/.bashrc\n. ~/.bashrc

Si vous n’avez pas de sauvegarde : retirez le bloc que vous avez ajouté à la fin de ~/.bashrc, puis rechargez le fichier. Les définitions livrées plus haut dans le fichier reprennent la main :

. ~/.bashrc

Et si l’invite est devenue illisible au point que vous ne pouvez plus travailler : fermez la fenêtre du terminal. Une nouvelle session repart des fichiers sur disque, donc de votre configuration enregistrée.

Le prompt Bash a-t-il déjà été documenté ailleurs ?

Oui, et il faut le dire sans mélanger les époques. Un ancien billet de CyberSDF traitait du prompt, à une période où la question se posait dans un contexte technique qui n’est plus le même. Ce billet est conservé pour ce qu’il est, avec son auteur : la méthode qui suit ne le reprend pas, ne le réécrit pas et ne le signe pas à sa place. Elle documente le comportement de bash tel qu’il est aujourd’hui, avec les commandes et les sorties observées.

Repères pour aller plus loin

Pour pratiquer le shell au quotidien :

La page de manuel bash reste la référence : man bash, puis cherchez PROMPTING. C’est la source de tout ce qui précède.