Du PS1 à Oh My Bash/Zsh/Posh : personnalisez votre terminal et rendez-le plus utile
Pimp my terminal !
Le 23 octobre 2020 à 14h32
9 min
Logiciel
Logiciel
Quoi de plus triste qu'un terminal ? Parce que dans la vraie vie, ce n'est pas comme dans les films et séries, il n'y défile pas sans cesse des caractères étranges que seuls des êtres supérieurs comprennent. Les développeurs ont aussi un petit cœur et aiment ce qui est mignon. Ce guide leur est dédié.
Lorsque vous lancez un invite de commandes, que ce soit sous Linux, macOS ou Windows, vous êtes habitués à obtenir une fenêtre sur fond noir avec le dossier courant et parfois un indicateur sur le nom de la machine. Mais saviez-vous que, comme les différents éléments de la fenêtre, cette petite ligne de texte est personnalisable ?
Il y a même des applications pensées uniquement dans ce but, avec leurs facilités et leurs thèmes prêts à l'emploi. Ils n'apportent d'ailleurs pas que des indications graphiques. Vous pouvez également ajouter l'heure courante, le statut d'un dépôt Git et autres petites informations qui peuvent vous aider au quotidien.
Voici un petit guide pour vous guider dans les méandres de la personnalisation du terminal.
PS1 sous Unix, késako ?
Commençons par un exemple simple avec le fameux PS1 (Prompt String 1) d'Unix, donc utilisé tant sous Linux que macOS. Il s'agit du texte qui s'affiche à gauche du curseur lorsque vous ouvrez un terminal. Une simple variable que vous pouvez modifier, mais aussi faire évoluer selon des scripts complexes comme nous le verrons plus loin.
La manière de réagir de PS1 dépend de votre Shell. Dans la plupart des distributions, c'est Bash (/bin/bash
) qui est installé et utilisé par défaut. Pour savoir si c'est votre cas, tapez la commande suivante :
echo $SHELL
Pour connaître la valeur PS1 actuelle, c'est la même chose :
echo $PS1
Notez qu'il existe des valeurs PS2, PS3, PS4 et PROMPT_COMMAND que nous n'utiliserons pas ici.
Modifions PS1 à la main
Vous pouvez y écrire ce que vous voulez sans risque, cela ne sera valable que pour la session courante :
PS1="Ceci est la machine de moi > "
Désormais, c'est ce texte que vous aurez à chaque début de ligne. Vous pouvez aussi ajouter des variables et des couleurs, la liste complète de celles prises en compte par Bash est disponible ici. Par exemple :
PS1="\[\e[1;34 m\]\A \[\e[0 m\]\$ "
Ici, on affiche l'heure courante et le statut de l'utilisateur (# s'il est root, $ sinon). On y ajoute de la couleur avec des codes comme \e[1;34 m
qui représente une déclinaison de bleu. Il faut penser à l'encadrer de caractères indiquant que c'est une valeur qui ne sera pas affichée : \[...\]
, ce qui donne ce résultat assez complexe. Si vous modifiez les couleurs, pensez toujours à déclarer celle des caractères qui suivront PS1 (ici blanc, donc \e[0 m
).
On peut ensuite aller encore un peu plus loin :
PS1="\[\e[1;34 m\]\A ⚡ \[\e[0 m\]$(lscpu | grep 'Cœurs' | awk '{print $4}')C/$(nproc)T ⚡ \[\e[32 m\]\w > \u:\$ \[\e[0 m\]"
Qui ne fonctionne sur un système français. En anglais ou dans le cas du sous-système Linux (WSL) de Windows 10 :
PS1="\[\e[1;34 m\]\A ⚡ \[\e[0 m\]$(lscpu | grep 'Core(s)' | awk '{print $4}')C/$(nproc)T ⚡ \[\e[32 m\]\w > \u:\$ \[\e[0 m\]"
Dans cet exemple, on utilise des variables issues d'applications affichant le nombre de cœurs du CPU : lscpu
et nproc
. Vous pouvez faire de même avec n'importe quel outil renvoyant une simple valeur. Concernant les émojis, ils sont exploitables directement ou peuvent être remplacés par leur valeur Unicode si vous préférez.
Au final, nous obtenons le résultat suivant :
Oh my Bash : thèmes et plugins prêts à l'emploi
La pratique de la modification du PS1 n'est pas nouvelle. Elle a donc à travers le temps suscité des vocations, notamment pour simplifier un peu la procédure en l'encadrant avec des thèmes.
C'était d'autant plus nécessaire que cela permet d'automatiser certaines tâches, dont l'écriture dans le fichier de configuration .bashrc
qui rend la modification pérenne, mais aussi d'aller vers des modifications plus complexes prenant en compte des scripts pour afficher le statut d'un dépôt Git, l'IP de la machine ou la météo.
Pour Bash, un tel outil existe et se nomme Oh my Bash. Son installation est simple, passant par un script :
bash -c "$(wget https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh -O -)"
Avec cette commande, il est téléchargé puis exécuté. En cas de problème, il se désinstalle aussi simplement :
uninstall_oh_my_bash
Après sa mise en place, vous aurez tout de suite un PS1 amélioré affichant l'heure, le nom de l'utilisateur, de la machine, le dossier, le statut d'un dépôt Git ainsi que la branche dans laquelle vous vous trouvez. Vous pouvez modifier le thème utilisé à travers la variable OSH_THEME
du fichier de configuration :
nano ~/.bashrc
Pour afficher tout de suite la modification :
source ~/.bashrc
La liste des thèmes disponibles se trouve par ici, des captures sont visibles par là. Il faudra parfois passer par certaines procédures d'installations et autres plugins, ou ajouter une police comme powerline. Pensez à garder si un guide d'installation est présent ou détaillé, notamment dans ce dossier.
Vous pouvez bien entendu créer vos thèmes et les modifier comme bon vous semble. Ils se trouvent dans ~/.oh-my-bash/themes/
. L'activation des plugins se fait également en modifiant le fichier .bashrc
.
Le thème « font » utilisé par défaut par Oh My Bash, puis Kitsune qui doit être utilisé avec le plugin battery
Oh My Zsh pour un Shell plus productif
Le travail autour de Oh my Bash est inspiré de Oh My Zsh, pensé pour Z Shell (zsh) qui est en général apprécié, car bien plus complet et riche en fonctionnalités que Bash... si on se donne la peine de le paramétrer. C'est là qu'est né l'idée de cet outil tout-en-un qui active de nombreuses options très utiles par défaut et donne accès aux thèmes.
Son installation passe elle aussi par un simple script à lancer et installer. On y trouve également thèmes et plugins, mais pouvant aller plus loin que sous Bash, avec une communauté plus développée.
sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
Il existe d'ailleurs de nombreux articles et des vidéos consacrés au sujet. Une fois l'installation effectuée, il vous sera proposé d'utiliser zsh par défaut, avec une configuration vide, effectuée manuellement ou prédéfinie. Si c'est votre première fois, on vous conseille ce dernier choix. Vous pourrez par exemple naviguer au clavier lorsque vous effectuez un ls
pour afficher la liste des fichiers et dossier du répertoire courant.
La configuration est similaire à Oh My Bash, mais se fait cette fois en modifiant le fichier ~/.zshrc
. Cela peut donner des résultats plutôt intéressants, exploitant également la colonne de droite du terminal. Comme celui d'un lecteur nous ayant soumis la capture de son terminal sous zsh avec le thème Powerlevel10k :
Vous êtes plutôt porté sur fish ? N'ayez crainte, il y a aussi un « Oh My » pour vous.
PowerShell, le nouveau Terminal et Oh my Posh
Et Windows dans tout ça ? Eh bien entre le bon vieil invite de commandes et PowerShell, il était plutôt laissé de côté sur ces joyeuseries graphiques, à quelques exceptions près. Mais l'arrivée du nouveau Terminal a changé la donne. Avec lui sont arrivées de nombreuses nouveautés, mais aussi des possibilités de personnalisation.
Certes, cela passe encore souvent par un fichier JSON à modifier et c'est un peu limité, mais c'est un début. Dans un billet récent, l'équipe de Microsoft en a détaillé certaines, évoquant un projet équivalent aux deux précédents : Oh my Posh. Lui aussi inspiré de Oh My Zsh, mais se focalisant sur l'application de thèmes pour PowerShell.
Son installation passe par de simples modules (en mode Administrateur) :
Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser
Pour tester un thème, vous pouvez ensuite simplement taper les commandes :
Set-Prompt
Set-Theme Powerlevel10k-Lean
Si vous rencontrez une erreur, c'est peut être que l'exécution de scripts PowerShell n'est pas autorisée :
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
Là aussi, les icônes et polices par défaut seront parfois insuffisantes. Vous pouvez alors installer Cascadia PL comme indiqué dans ce guide, qui détaille également comment profiter de Powerline dans WSL. Microsoft évoque aussi les projets Terminal-Icons et Nerd Fonts pour ajouter un grain de folie supplémentaire.
Par exemple, pour utiliser CaskaydiaCove dans le profil par défaut, ajoutez dans les paramètres du Terminal :
"defaults":
{
"fontFace": "CaskaydiaCove NF"
},
Pour rendre votre configuration durable, il faut éditer le profil utilisateur :
notepad $PROFILE
Pour y ajouter le contenu suivant (à adapter au thème qui aura votre préférence) :
Import-Module posh-git
Import-Module oh-my-posh
Set-Theme Powerlevel10k-Lean
Notez que la v3 de Oh my Posh, actuellement en test, introduira l'utilisation de fichiers de configuration plus simples, faciles à partager, à réutiliser d'une machine à l'autre. Il fonctionnera avec Windows Terminal, mais aussi ConEmu, Alacritty, Terminus, Hyper, FluentTerminal et différents Shells : zsh, bash, nix ou fish.
Et vous, à quoi ressemble votre configuration idéale, qu'il s'agisse de thèmes et plugins ou d'un simple PS1 ? N'hésitez pas à nous le dire en commentaires et à partager vos astuces avec nos autres lecteurs.
Vous arriveriez à travailler dans ce terminal, vous ?
Du PS1 à Oh My Bash/Zsh/Posh : personnalisez votre terminal et rendez-le plus utile
-
PS1 sous Unix, késako ?
-
Modifions PS1 à la main
-
Oh my Bash : thèmes et plugins prêts à l'emploi
-
Oh My Zsh pour un Shell plus productif
-
PowerShell, le nouveau Terminal et Oh my Posh
Commentaires (40)
Vous devez être abonné pour pouvoir commenter.
Déjà abonné ? Se connecter
Abonnez-vousLe 23/10/2020 à 15h06
<3
Le 23/10/2020 à 15h57
C’est toujours intéressant de découvrir ce genre d’outils, mais pour le coup je n’ai jamais vu l’intérêt de personnaliser le PS1 outre l’aspect ludique passager que ça procure…
L’ajout de l’heure à la limite peut-être sympa (si on a tendance à garder un terminal d’ouvert pour longtemps et donc plein d’usages variés, savoir quand les commandes ont été tapées, why not…), mais pour le reste ce sont bien souvent des infos inutiles, ou en tout cas qu’on l’on a absolument pas besoin de savoir à chaque nouvelle ligne de commande qu’on tape…
Typiquement cet exemple des cores/threads (au passage la commande ne fonctionne pas chez moi, les lignes avec la bonne info de cores contient “cœur(s)” et pas “cœurs”)… si je me repose la question un jour, je connais bien 5-6 commandes pour me donner la réponse, et cette info m’est inutile au quotidien… en plus quelqu’un qui met ça dans son PS1, au final 2 semaines plus tard ce sera gravé dans sa mémoire et il pourra donc changer son PS1.
Bref, bof bof comme on dit, j’espérais trouver de nouveaux usages à donner à PS1, mais ce n’est pas vraiment le cas. :)
… sauf vraiment pour la spécificité avec Git ! Je trouve toujours que ça reste gadget, mais là okay pour le coup pour cette utilisation très précise le nouveau rendu peu être + sympa. Même si encore une fois en terme d’infos affichées, la valeur ajoutée me semble pas hyper pertinente non plus sauf personnes très spécifiques qui changent de branche toutes les 5 minutes.
Dans la genre bien utile mais rien à voir avec PS1 en revanche, je vous suggère de creuser vers l’usage de less (parce que “less is more than more”) pour faire de la coloration syntaxique un peu plus généralisée dans le terminal (typiquement pour colorer du code et les man dans le terminal..!). O:)
Le 23/10/2020 à 16h04
L’exemple était volontairement trivial, pour montrer qu’on peut in fine remonter n’importe quoi (la température de ta pièce si ça t’amuse). Pour le reste, c’est comme tout ; pas besoin, pas grave, si besoin, c’est là. Je ne suis d’ailleurs pas d’accord sur l’inutilité globale que tu évoques.
Outre le fait de pouvoir adapter le PS1 comme ça te chante (on y passe du temps après tout), l’affichage des branches Git et du statut du dépôt facilite quand même pas mal la vie, comme tu le concèdes. Mais c’est un élément parmi d’autres dont on peut avoir besoin, chacun fait selon ses besoins/imagination.
Amha l’important c’est de comprendre que le PS1 est un élément avec une valeur par défaut selon le shell/la distribution, que l’on peut adapter de manière plus ou moins complexe si ça ne nous convient pas. Et si on est bien comme ça, soit ;)
Le 24/10/2020 à 07h55
Deux usages primordiaux :
Le 23/10/2020 à 17h33
Un truc utile (voire indispensable) pour moi, le symbole $ ou # rouge après une erreur et vert si la commande a renvoyée 0 … Ça permet de détecter des erreurs qu’on peut laisser passer …
_red=”[\((tput setaf 1)\]"
_green="[\)(tput setaf 2)]”
_reset=”[\((tput sgr0)\]"
PROMPT_COMMAND='RET=\)?; feedback=“”
[[ \(RET != 0 ]] && feedback="\){_red}” || feedback=”\({_green}"
[[ \)(id -u) -eq 0 ]] && sym=“#” || sym=”\("
PS1="\){debian_chroot:+(\(debian_chroot)}\u@\h:\w\ "
PS1+="\){feedback}\({sym}\){_reset} “’
Le 24/10/2020 à 09h41
C’est sympa comme info, je n’avais jamais pensé à ça.
Le 23/10/2020 à 18h11
Avoir un prompt différent “prod”/“test”, ou rappeler dans le prompt le site sur lequel on opère, le login dans lequel on est quand on a des logins différents, le “mode” dans lequel un serveur est (http suspendu, …), le type de noeud (html/php/app/rproxy)…
J’ai ultra souvent changé le prompt, y compris sous MSDOS/OpenVMS, selon ce qui importait.
Le 23/10/2020 à 18h24
Le git prompt est indispensable ! Pareil pour la couleur. Et à l’instant, je me dis que je devrais ajouter ma version de gcc courante (vu que je travaille avec bien 8 versions différentes). Je tenterai sans doute lundi !
Merci David pour ce bel article (à nouveau!)
Le 23/10/2020 à 18h37
Content de faire plaisir avec des papiers sur de tels sujets en tous cas
Le 23/10/2020 à 20h04
Personnellement, utilisant parfois plusieurs JDK ou Maven, je trouve pratique d’avoir la version en cours même si par défaut c’est toujours la 11 (enfin, chez moi ). L’heure est également pratique ainsi que l’host, et la couleur sinon c’est terne.
(A suivre sur Nextinpact, la complétion Bash ? )
Le 23/10/2020 à 21h14
Suivant les environnements de travail, ça peut se révéler une precieuse aide: détection de repo git, branche courante, retour de commande, contexte de travail….
Le 23/10/2020 à 21h16
Juste pour info, au lieu de faire
source ~/.bashrc
, vous pouvez juste faire. ~/.bashrc
:)Le 23/10/2020 à 21h20
feignasse
Le 23/10/2020 à 21h38
Et fier de l’être
Le 27/10/2020 à 08h05
Tu viens de me faire découvrir un truc, merci pour l’astuce
Le 23/10/2020 à 21h52
“Quoi de plus triste qu’un terminal” ?
Une fenêtre ?
Surtout quand on est obligé d’utiliser la souris pour interagir avec une application
Le 23/10/2020 à 23h20
Quelle tristesse de ne pas devoir deviner la bonne ligne à taper et de juste devoir choisir parmi ce qu’on a déjà devant les yeux qui fonctionnera à coup sûr.
Quelle tristesse de pouvoir faire des Ctrl-Z et autres fonctions d’annulations d’une mauvaise manip…
Le 23/10/2020 à 22h17
Pas tout à fait la même chose.
source ~/.bashrc
lance la commande dans le processus shell courant.. ~/.bashrc
lance la commande dans un nouveau processus shell.Le 24/10/2020 à 07h24
Oui, si je ne m’abuse, sans le ‘source’ les variables exportées (dont PS1) ne seront pas mises à jour
Le 24/10/2020 à 08h22
sous bash c’est la même chose.
https://ss64.com/bash/source.html
Le 24/10/2020 à 08h56
C’est surtout que source est une commande intégrée de bash (et autres shells, mais pouvant avoir des variantes) tandis que pour être compatible POSIX il est recommandé d’utiliser le dot.
Le 24/10/2020 à 10h06
C’est inexact. Si c’était dans un nouveau processus tu ne récupérerais pas les variables modifiées ou définies. En bash . est un alias pour source.
Le 24/10/2020 à 07h22
Si tu es développeur fais l’essai, à mon avis, tu pourras plus t’en passer! 🙂
Bon ok c’est subjectif, ça peut dépendre de ton usage de git, perso ça me paraît tellement indispensable de savoir à tout moment sur quelle branche je me trouve, bien plus par exemple que le hostname qui à mon avis sert plus aux sysadmins
Le 24/10/2020 à 07h46
Juste informaticien
Le 24/10/2020 à 09h29
Quel plaisir de pouvoir scripter a la souris
Le 24/10/2020 à 09h46
J’avoue que voir la branche git sur lequel on est en permanence m’avait attiré.
Mais entre le fait que Oh My Bash change beaucoup trop de chose de base, et le fait qu’une commande git est appelé à chaque entré du prompt, qui du coup peut ralentir l’affichage lorsqu’on est sur un point de montage externe un peu lent, m’ont fait revenir vite en arrière ^^’
Je suis flemmard, comme tout informaticien qui se respect, mais pas au point de ralentir l’accès de la ligne de commande juste pour éviter de faire un
git status
ou ungit branch
. Surtout qu’au pire il y a les alias pour raccourcir ces commandes…Édite : Le code inline s’affiche en block, c’est un bogue ou c’est normale ?
Le 24/10/2020 à 10h11
Il doit être possible de faire ça en conditionnel , genre n’afficher la branche que si tu n’es pas dans /mnt , /media ou autres… Au pire si pas possible de le faire avec Oh My Bash tu peux le faire avec le PS1 de base.
Le 24/10/2020 à 11h27
Oui, les possibilités sont là. Après il faut vouloir passer un certain temps pour peaufiner tout ça, à voir ^^
Le 24/10/2020 à 10h50
Tout dépend de ton usage, mais pour moi, avoir le nom d’utilisateur, de machine, le résultat de la commande précédente et son temps d’exécution est très souvent utile.
Le 24/10/2020 à 13h15
Alors concernant oh my zsh, c’est très bien pour débuter et découvrir pas mal de possibilité. Mais au final, c’est lourd, et un peu usine à gaz. Je conseille par un gestionnaire de plugin comme zplug ou antigen qui peuvent utiliser les plugins de oh my zsh sans tous télécharger.
Le 26/10/2020 à 09h44
Pour ceux qui ne connaissent pas il y a aussi : https://starship.rs/.
C’est un programme écrit en Rust qui va personnaliser le promt de différents shell (bash,zsh,fish,powershell) en fonction de la configuration écrit dans un fichier toml.
Personnellement, on peut pas dire que le truc m’ait convaincu mais si vous voulez tester…
Ha merci pour zplug, je connais pas. Au vu du nom je suppose que c’est un vimplug like. Et si il est aussi “kiss” je l’adopte de suite.
Et oui, merci à l’équipe pour les articles sur Git, Bash etc etc, même si on connait c’est toujours sympa de lire ce genre d’articles.
Le 24/10/2020 à 16h07
Un truc utile aussi quand on fait des chipotages avec le PS1, c’est d’éviter de toucher à la variable quand on est pas en interactif sous peine d’avoir des trucs qui balancent des messages, erreurs ou qui ne marchent même pas du tout. Perso j’ai toujours fait ainsi pour les variables que je ne veux pas dans mon environnement quand je ne suis pas connecté en interactif :
if [[ $- =~ "i" ]]; then
PS1="..."
fi
Sinon sous Ubuntu, il y a apparemment par défaut un “case au début du ~/.bashrc qui a le même effet pour tout ce qui suit :
case $- in
i) ;;
*) return;;
esac
PS1="..."
edit: euh… comment on fait pour avoir plusieurs lignes de code en un seul bloc ?
Le 24/10/2020 à 17h15
Personnellement j’utilise liquidprompt (https://github.com/nojhan/liquidprompt)
J’y mets : la machine et le compte utilisés, (savoir sur quelle machine est un terminal…) le code de retour et le temps d’exécution de la dernière commande (utile quand la commande a un problème).
branche et statut git dans les répertoires sous git, etc.
En fait ça dépend vraiment de son utilisation.
Le 24/10/2020 à 20h10
J’ai grave galéré pour que les icônes de Terminal-Icons s’affichent correctement… Je sais pas pourquoi mais avec “Cascadia Code PL”, j’obtiens des rectangles vides. Du coup, j’ai installé “JetbrainsMono NF” et là ça fonctionne :)
Le 25/10/2020 à 15h22
Autre option qui fonctionne à coup sûr, forcer LC_ALL sur une valeur de base pour être sûr d’avoir des résultats en anglais qui changeront beaucoup moins souvent d’une machine à l’autre que les résultats traduits (les développeurs ont beaucoup plus à cœur de ne pas changer le format des résultats pour éviter de casser des scripts existants plutôt que les traducteurs).
Dans l’exemple de David, ça donnerait (à vérifier tout de même) :
PS1="[\e[1;34m\]\A ⚡ [\e[0m\]$(LC_ALL=C lscpu | grep 'Core(s)' | awk '{print $4}')C/$(nproc)T ⚡ [\e[32m\]\w > \u:\$ [\e[0m\]"
Un triple accents graves, ça ne fonctionne pas ? Édit : Bon bah nan, tu l’avais sans doute testé aussi…
Le 26/10/2020 à 03h56
Merci pour ces supers articles pratico pratiques que vous faites pour les devs, ces derniers mois.
Continuez comme ça <3
Le 26/10/2020 à 04h39
Merci
Le 26/10/2020 à 10h20
Oui.
Le 26/10/2020 à 12h11
Perso moi j’utilise ça:
export PS1=’[\033[01;32m]\u@\H[\033[00m]:[\033[01;34m] [\({PWD}] \t[\033[00m\]\\) ‘
Dans mon .bash_profile
Etant dba et sysadmin, mais pouvant lancer des commandes longues, j’ai besoin d’un prompt léger
Le 29/10/2020 à 12h10
Merci pour les réponses en commentaire, ça enrichit pas mal l’article de base!
Quelques bonnes idées que je tenterai probablement à l’occasion du coup. :)
Concernant les quelques questions, je fais du dev embarqué en C et pour le coup, le mot d’ordre étant “stabilité”, je n’ai jamais de questions de versions ou quoi à me poser. Et comme déjà dit, un git status/branch quand nécessaire font largement le café !
…A l’inverse, la coloration selon code d’erreur de la commande précédente… du génie..!