fbpx

Réaliser un prompt personnalisé avec la variable Bash $PS1

Réaliser un prompt personnalisé avec la variable Bash $PS1

Par défaut sur Linux le prompt proposé est souvent assez basique voir simplissime, mais il est possible d’en créer de beaucoup plus évolués.

Exemple de base

Sur Linux Debian, par défaut le prompt ressemble à ça :

root@OMN-debian:/home/omunier#

Afin de voir à quoi correspond ce prompt on lance dans un terminal la commande :

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

La première partie avec les « debian_chroot » n’est valable que si le fichier /etc/debian_chroot existe et contient une valeur, nous ne nous attarderons pas dessus.

La deuxième partie est, elle, directement en rapport avec l’aspect du prompt : \u est l’utilisateur courant (root dans l’exemple) \h est le nom de la machine (OMN-debian dans l’exemple) \w est le nom du répertoire courant (avec un tilde ~ correspondant au HOME de l’utilisateur actuel) (/home/omunier dans l’exemple) \$ qui prend la valeur « $ » si l’utilisateur actuel est quelconque, et « # » si l’utilisateur actuel est le super utilisateur (root) Ainsi on peut voir sur ce simple exemple le fonctionnement de la variable PS1.

Un exercice tout simple est d’ouvrir une console et d’y entrer :

PS1="Salut mon ami \u : "

Et de constater le résultat.

Mais ces 4 variables ne sont pas les seules possibles pour customiser le prompt de votre shell Bash.

Liste des variables

  • \a : Caractère invisible cloche (code ASCII 0x07)
  • \d : La date courante au format “Jour Mois N°Jour” (ex : “mer. nov. 07”)
  • \D{format} : La date courante au format défini entre les accolades, ce format est consultable avec la commande man strftime Les accolades sont obligatoires, si aucun format n’est spécifié la valeur par défaut sera HH:MM:SS.
  • \e : Caractère invisible echap (code ASCII 0x1B).
  • \h : Le nom de l’hôte (jusqu’au premier point).
  • \H : Le nom de l’hôte complet.
  • \j : Nombre de job en tâche de fond dans le shell actuel.
  • \l : Numéro du shell actuel (si plusieurs shell ouverts)
  • \n : Nouvelle ligne
  • \r : Retour chariot (retour en début de ligne)
  • \s : Le nom du shell tel que défini par la variable $0.
  • \t : L’heure actuelle au format 24-heure HH:MM:SS
  • \T : L’heure actuelle au format 12-heure HH:MM:SS
  • \@ : L’heure actuelle au format 12-heure am/pm
  • \A : L’heure actuelle au format 24-heure HH:MM
  • \u : Le nom de l’utilisateur courrant.
  • \v : La version actuelle de bash (ex : 4.4)
  • \V : La version actuelle de bash + numéro de patch (ex : 4.4.23)
  • \w : Le chemin entier du répertoire de travail actuel (avec un tilde « ~ » correspondant au HOME de l’utilisateur actuel).
  • \W : Le répertoire de travail actuel (avec un tilde « ~ » correspondant au HOME de l’utilisateur actuel).
  • \! : Le numéro dans l’historique de la commande.
  • \# : Le numéro de la commande.
  • \$ : Si l’UID de l’utilisateur est 0 (en général c’est root) alors ce sera le symbol « # », pour tout autre utilisateur ce sera « $ »
  • \\ : a backslash
  • \[ : Pour débuter une séquence de caractères non imprimables (une séquence de contrôle par exemple)
  • \] : Pour finir une séquence de caractères non imprimables.
  • \xxx : xxx étant un numéro décimal ou hexadécimal, cette syntaxe permet d’entrer des caractères de contrôle (non visible) par exemple echap pourra aussi s’écrire \033 ou \x1B

Exemples

Afin de se familiariser avec ces variables, le mieux est de faire des tests, voici quelques exemples au hasard :

PS1="\u \w \n\$"
PS1="\d \t \n \u \$ "
PS1="\u@\H \t \n\$ : "
PS1="\D{%A %d %B %T}\n\$ : "

Les couleurs

Maintenant que nous savons afficher les informations qui nous intéressent, il serait bien de leur donner un peu de couleur, heureuse coïncidence Bash permet cela.

La syntaxe générale est la suivante : Pour démarrer un formatage, on commence par un echap « \e » puis un chevron ouvrant « [ » ensuite un « code » et on termine par « m« . Afin de terminer n’importe quelle formatage (texte, fond ou autre) la séquence est la même mais le code est égal à 0.

Ici, on met le nom de l’utilisateur en jaune gras.

PS1="\e[93m\u\e[0m"

Les codes 8 couleurs

Le Texte

Comme on peut le voir, dans le code des couleurs, les valeurs pour le texte vont de 30 à 37 pour le texte normal et de 90 à 97 pour le texte lumineux. Si la séquence « \e[0m » stoppe toutes les formes de formatage, il existe une séquence pour stopper exclusivement le formatage du texte c’est « \e[39m« .

Ici, on défini un fond bleu, puis le nom de l’utilisateur en rouge, ensuite on stoppe la couleur du texte, mais le fond reste actif et on affiche répertoire courant et enfin on stoppe la couleur de fond.

PS1="\e[104m\e[31m\u\e[39m \w\e[0m "

Le Fond

Comme on peut le voir dans le code des couleurs, les valeurs pour le fond vont de 40 à 47 pour le fond normal et de 100 à 107 pour le fond lumineux. De même que pour le texte, il existe une séquence pour stopper exclusivement le formatage du fond c’est « \e[49m« .

Ici, on définit le texte en mauve, puis l’heure actuelle avec un fond cyan et on stoppe ce fond avant d’afficher le répertoire courant.

PS1="\e[95m\u \e[106m\t\e[49m \w\e[0m "

Les autres formatages

Il est aussi possible d’effectuer d’autres opérations sur le texte du prompt.

  • « \e[1m » mettra en gras le texte « \e[21m » stoppera le gras.
  • « \e[2m » mettra en sombre le texte « \e[22m » stoppera le sombre.
  • « \e[4m » soulignera le texte « \e[24m » stoppera le soulignage.
  • « \e[5m » fera clignoter le texte « \e[25m » stoppera le clignotement.
  • « \e[7m » inversera la couleur du texte par rapport à la couleur du fond « \e[27m » stoppera l’inversion.
  • « \e[8m » rendra le texte invisible (utilisé pour les mots de passe) « \e[28m » stoppera l’invisibilité.

Notons qu’il est possible de coupler les codes, ainsi si on veut mettre l’heure courante clignotante en rouge sur fond vert on peut l’écrire de 2 manières :

La manière longue.

PS1="\e[42m\e[31m\e[5m\t\e[0m "

Ou en couplant les codes.

PS1="\e[42;31;5m\t\e[0m "

Commande dans le prompt

Il est aussi possible d’effectuer des commandes à chaque opération et d’afficher directement dans le prompt les résultats, par exemple

PS1='\e[95m\u \e[7m\d \t\e[27m \w \e[106m$(echo $?)\e[0m \n'

Donnera le code de retour de la commande précédente avec la commande shell $(echo $?) on note que pour que la commande soit exécutée à chaque fois il faut que la variable PS1 soit définie avec des simple quottes et non des doubles comme c’était le cas précédemment

Le fichier .bashrc

C’est amusant de tester des combinaisons de prompt dans la console, mais une fois qu’on en a trouvé un bien, on a envie qu’il soit là dés qu’on ouvre un terminal. Pour cela il faut renseigner la variable PS1 dans le fichier .bashrc qui se trouve dans le répertoire personnel (symbole ~) sur Debian (Ubuntu, Mint, …) c’est /home/<votre_nom>

vim ~/.bashrc
partie prompt du bashrc sur Debian

Ici on voit mon prompt perso à la ligne 63, notons aussi que j’ai forcé la couleur (même si c’était pas forcément nécessaire) à la ligne 49

Notes

Il est aussi possible d’utiliser ce formatage avec des chaînes de caractère grâce à la commande

echo -e "\e[42;31;5mSalut mon pote\e[0m "

Certain terminaux supportent 256 couleurs il sera donc possible d’utiliser un code beaucoup plus vaste sur ces terminaux (j’en parlerais dans un article) afin de savoir combien de couleur gère votre terminal il faut enter la commande

infocmp -1 |grep colors

La réponse sera soit :

colors#8

soit :

colors#256

 

Olivier Munier

Au début des années 2000, j'ai découvert Linux et le monde des logiciels libres et open source. Assez vite j'ai décidé de me spécialiser sur ce vaste monde afin de devenir un expert. Titulaire d'un master en Informatique, et passionné par ce domaine, mes compétences couvrent un très large éventail, notamment l'administration système Linux, la virtualisation et la programmation Python.

Une pensée sur “Réaliser un prompt personnalisé avec la variable Bash $PS1

  • 2 janvier 2019 à 6 h 57 min
    Permalink

    It’s difficult to find educated people in this particular topic, however, you sound like you know what you’re
    talking about! Thanks

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *