CyberSDF

Reprenez la main sur votre numérique

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

Terminal affichant une invite Bash colorée avec le chemin du répertoire courant.

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
  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

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 :

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

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 :

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 :

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.

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 :

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 :

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.