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
- Où bash lit-il le prompt que vous voyez ?
- Quels raccourcis peut-on mettre dans un prompt ?
- Comment tester un prompt sans toucher à vos fichiers ?
- Comment colorer le prompt proprement ?
- Comment écrire la modification dans un fichier et la rendre réversible ?
- ~/.bashrc ou ~/.profile : que mettre où ?
- Quand un prompt « clé en main » coûte-t-il plus qu’il ne rapporte ?
- Comment revenir à l’état initial ?
- Le prompt Bash a-t-il déjà été documenté ailleurs ?
- Repères pour aller plus loin

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 :
PS1est l’invite principale, affichée quand bash attend une commande ;PS2est l’invite secondaire, affichée quand une commande est incomplète, par exemple une chaîne non fermée ;PS0est affiché après la lecture d’une commande mais avant son exécution ;PS4est affiché avant chaque commande tracée quand l’option-xest active.
L’invite principale est définie à deux endroits, et cela dépend du type de session :
- une session interactive non connectée (« login ») lit
/etc/bash.bashrcpuis~/.bashrc; - une session connectée lit en plus
~/.bash_profile,~/.bash_loginou~/.profile, le premier de ces fichiers qui existe et est lisible, dans cet ordre.
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 :
PROMPT_DIRTRIM: si cette variable contient un un niveau supérieur à zéro,\\wet\\Wne conservent que ce nombre de composants de répertoire, le reste étant remplacé par des points de suspension ;PROMPT_COMMAND: si vous la définissez, sa valeur est exécutée avant chaque affichage de l’invite principale. Utile pour recalculer un affichage, mais c’est aussi un endroit où l’on accumule des commandes sans le voir.
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 :
\\033[01;32mproduit bien une séquence d’échappement (visible en\\x1b) : le vert est un code du terminal, pas du texte ;\\033[00mremet le style à zéro après chaque élément coloré, sans ce retour, la couleur déborderait sur tout ce que vous tapez ensuite ;\\[et\\]n’apparaissent pas dans la sortie : ils sont consommés par bash, c’est leur rôle.
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.
~/.bashrcest lu par les shells bash interactifs. C’est l’endroit du prompt, des alias et des fonctions que vous tapez à la main.~/.profileest lu par les shells connectés (login). C’est l’endroit des variables d’environnement,PATHnotamment.
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 :
- une dépendance de plus : chaque outil installé doit être mis à jour, et il peut cesser d’être maintenu ;
- une configuration à connaître : le jour où l’invite n’affiche plus le bon répertoire, il faut savoir où se règle le problème ;
- une suppression à prévoir : un prompt qui s’installe en une commande doit aussi pouvoir partir en une commande, sans laisser de lignes actives dans vos fichiers.
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 :
- le guide Linux et terminal rassemble l’univers Linux publié ici ;
- les premières commandes Linux pour se repérer dans un terminal sans risque ;
- le guide de survie en ligne de commande pour les gestes d’urgence ;
- les gestes sur fichiers et répertoires pour manipuler vos fichiers sans perte.
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.