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 composer une valeur sans retenir les séquences, utilisez le configurateur de prompt Bash. 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 supplémentaire n’est nécessaire pour ces exemples Bash. Les séquences et les fichiers de démarrage sont documentés dans le manuel de Bash 5.2 fourni par Debian trixie. Les noms camille et atelier, ainsi que les invites représentées ci-dessous, sont des illustrations : ils ne constituent pas un relevé de votre terminal.
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 :
- sous Debian, une session interactive non connectée (« non-login ») lit
/etc/bash.bashrcpuis~/.bashrc, si ces fichiers existent ; - une session connectée (« login ») lit d’abord
/etc/profile, puis le premier fichier existant et lisible parmi~/.bash_profile,~/.bash_loginet~/.profile, dans cet ordre.
Une affectation simple, sans couleur, peut prendre cette forme :
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
Voici un exemple de bloc conditionnel pour ~/.bashrc. Il utilise la valeur de color_prompt, qui doit avoir été définie auparavant dans le fichier :
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
Ce bloc choisit la couleur seulement si color_prompt vaut yes. Il ne détecte pas à lui seul les capacités du terminal. Si votre fichier contient déjà une détection adaptée, conservez-la plutôt que de forcer cette valeur.
Pour un Bash interactif non-login, --norc empêche la lecture de /etc/bash.bashrc et de ~/.bashrc. Cette option ne remplace pas --noprofile, qui concerne les fichiers de connexion. Une invite minimale peut, par exemple, ressembler à ceci :
bash-5.2$ echo cas-ok
Bash possède aussi une valeur de PS1 par défaut. Les fichiers de configuration peuvent la remplacer ; ne pas lire ~/.bashrc ne signifie donc pas qu’aucune invite ne sera affichée.
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 une valeur supérieure à 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 une première affectation pour Bash, suivie d’une illustration de l’invite et d’une commande saisie :
PS1='\u@\h:\w\$ '
camille@atelier:/home/camille/projets$ echo cas-ok
cas-ok
Puis la version courte, qui n’affiche que le dernier dossier :
PS1='[\u@\h \W]\$ '
[camille@atelier projets]$ echo cas-ok
cas-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 ?
Pour que la largeur de l’invite soit calculée correctement, encadrez les séquences de contrôle de couleur avec \[ et \]. Ces marqueurs délimitent les caractères non imprimables ; le texte visible de l’invite reste en dehors.
Exemple de valeur colorée pour Bash :
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
Représentation symbolique d’un rendu possible pour cet exemple : \x1b désigne ici un caractère d’échappement, pas les quatre caractères à afficher dans le 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.
Si votre ~/.bashrc contient déjà une condition fondée sur force_color_prompt, utilisez le réglage prévu par ce fichier. L’affectation suivante n’a pas d’effet si aucune ligne ne consulte cette variable :
force_color_prompt=yes
Dans le bloc montré plus haut, c’est color_prompt qui choisit l’invite. Définir seulement force_color_prompt ne modifie pas ce bloc : vérifiez la condition réellement présente dans votre fichier.
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. La commande ci-dessous garde un nom de sauvegarde fixe, utilisable un autre jour. L’option -i demande confirmation avant d’écraser un fichier existant. Si cette sauvegarde existe déjà, vérifiez-la avant de répondre ; si vous choisissez un autre nom, conservez ce même nom pour la restauration.
cp -i -- ~/.bashrc ~/.bashrc.avant-prompt
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 pour préserver littéralement la valeur affectée à PS1. Bash décodera les séquences du prompt lors de son affichage. Les guillemets doubles conservent notamment le rôle de $ : une substitution de commande placée dans cette affectation pourrait alors être exécutée dès l’affectation.
3. Vérifiez la syntaxe, puis rechargez le fichier. Le chaînage ci-dessous n’exécute la seconde commande que si le contrôle de syntaxe réussit :
bash -n ~/.bashrc && . ~/.bashrc
bash -n lit le fichier sans en exécuter les commandes ; cela ne teste pas le résultat visuel du prompt. . ~/.bashrc exécute ensuite le fichier dans la session courante. En cas d’erreur, ne rajoutez pas d’espace après PS1= : une affectation s’écrit sans espace autour du signe égal. Si une autre affectation ou PROMPT_COMMAND remplace votre valeur, il faut aussi examiner cette configuration.
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 au démarrage d’un Bash interactif non-login. Pour une session login, sa lecture dépend notamment d’un appel depuis le fichier de connexion.~/.profilepeut être le fichier de connexion lu par Bash si~/.bash_profileet~/.bash_loginne sont pas retenus avant lui. Il peut notamment définir des variables d’environnement.
Pour qu’un fichier de connexion comme ~/.profile charge ~/.bashrc, il peut contenir ce type de bloc. Vérifiez d’abord s’il existe déjà dans le fichier effectivement lu par votre session :
if [ -n "$BASH_VERSION" ]; then
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
Si le fichier de connexion effectivement lu contient cet appel, il chargera ~/.bashrc. La présence d’un ~/.bash_profile lisible peut empêcher Bash de consulter ~/.profile. Vérifiez donc ce parcours avant de dupliquer votre définition de PS1 dans plusieurs fichiers.
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.
Avant de copier un bloc d’invite, lisez ce qu’il contient. PS1 est une chaîne développée par Bash ; ses substitutions et les commandes de PROMPT_COMMAND peuvent exécuter du code avant chaque invite. Une simple valeur avec les marqueurs d’utilisateur et de répertoire n’exige pas de commande externe.
Comment revenir à l’état initial ?
Deux méthodes, selon ce que vous avez modifié.
Si vous avez suivi la sauvegarde proposée plus haut : restaurez ce même fichier, même un autre jour. L’option -i demande confirmation avant de remplacer votre configuration. Après une copie effectivement réalisée, rechargez-la avec . ~/.bashrc.
cp -i -- ~/.bashrc.avant-prompt ~/.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
Si le fichier enregistré est fautif, ouvrir une nouvelle fenêtre ordinaire peut relire le même problème. Pour ouvrir un Bash interactif sans les fichiers de connexion ni ~/.bashrc, utilisez bash --noprofile --norc -i, puis corrigez le fichier ou restaurez sa sauvegarde avant de le recharger.
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 rendus illustratifs présentés ici.
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.