Remplacer Bash par Zsh avec 'oh my zsh'
Sur les systèmes basés Linux ou Unix, il existe un élément de base qui s’appelle le shell. Il s’agit de l’interpréteur qui permet à l’utilisateur d’entrer différentes commandes pour qu’elles soient exécutées par le système. Par défaut sur de nombreuses distributions Linux, cet interpréteur est bash
, pour Bourne-again Shell, qui visait à remplacer le Bourne-shell aussi connu sous le nom de sh
.
Zsh est donc un autre interpréteur de commandes disponible sous Linux et d’autres Unix. C’est d’ailleurs le shell par défaut de MacOS depuis 2019. Bien qu’il soit aussi vieux que Bash, il est encore assez peu mis par défaut alors qu’il possède quelques atouts sympa, mais aussi une belle collection d’extensions et de thèmes qui ont été regroupés par le projet “Oh My Zsh”.
L’un des éléments les plus pratiques de zsh est que son auto-completion est interactive. Lorsqu’on appuie deux fois rapidement sur la touche Tabulation, le shell vous proposera les correspondances pour les fichiers commençant par les caractères que vous avez saisi (ou alors il listera tout le dossier). Bash vous proposera une simple liste tandis que Zsh vous permettra de sélectionner un élément avec les flèches.
Cette sélection fonctionne aussi avec une commande. Petit exemple ci-dessous :
Ces captures d’écran animées sont réalisées avec Peek
Une autre fonctionnalité que j’apprécie beaucoup et que j’avais connu avec Ksh sous AIX, c’est la substitution d’un emplacement. Dans le cas où vous êtes dans une arborescence dont seul un nom de dossier change (exemple : /home/user/Downloads /home/user/Documents), la commande cd
de Zsh permet de substituer de la façon suivante :
cd Documents Downloads
Résultat :
Oui, je fais 40 fautes de frappe à la seconde
Installer zsh
Zsh est généralement disponible dans les repos de la plupart des distributions Linux. Il suffit donc de le chercher dans le gestionnaire de paquets de celle-ci. Dans mon cas avec Fedora :
$ sudo dnf install zsh
Pour basculer dessus il suffit ensuite de l’appeler grâce à la commande zsh
.
La première fois, zsh affiche un écran de paramétrage et le fera aussi longtemps que le fichier ~/.zshrc
est absent. Si vous le souhaitez, vous pouvez lancer l’option 1 qui va vous poser plusieurs questions pour paramétrer l’environnement. Sinon, vous pouvez directement aller à la section d’après avec l’installation de Oh My Zsh qui va s’occuper de tout.
L’indicateur montrant que zsh
est actif est le changement du caractère précédent le curseur de texte. Le #
de Bash est remplacé par le %
de Zsh.
Installer Oh My Zsh
Oh My Zsh est un framework pour zsh qui permet de gérer la configuration de celui-ci et le personnaliser d’une manière très accessible. Par personnaliser, cela signifie d’ajouter des thèmes graphiques et diverses fonctionnalités sympa !
Pour lancer l’installation, il suffit de télécharger le script shell depuis leur repo Github. Je recommande d’utiliser la dernière méthode qu’ils proposent à savoir télécharger le script puis l’exécuter soit-même. Il est toujours plus sage de le lire avant pour comprendre ce qu’il fait. Je ne suis pas un grand fan des méthodes souvent proposées avec une exécution directe d’un script téléchargé sur Internet.
$ wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh
$ sh install.sh
Ici je suis sur un live-CD de Fedora. Sur mon véritable environnement, il a demandé si je voulais activer zsh par défaut, action qui a requise le mot de passe sudo
.
Personnalisation
Oh My Zsh aura créé dans le fichier ~/.zshrc
tout un tas de paramètres. D’ailleurs, si vous aviez personnalisé votre ~/.bashrc
il conviendra de les reporter car ce fichier ne sera plus chargé au lancement du shell.
Attention, n’oubliez pas de recharger le shell après tout changement du fichier ~/.zshrc
de la manière suivante : . ~/.zshrc
ou encore source ~/.zshrc
. Ou encore en fermant et rouvrant un terminal.
L’un des premiers changements que vous aurez sûrement envie de faire est le thème graphique. Il s’agit de la ligne suivante dans ~/.zshrc
:
ZSH_THEME="robbyrussell"
Celui que j’utilise dans la première capture d’écran, et probablement l’un des plus populaires, est agnoster
. Vous en trouverez tout un tas sur le repo Github du projet dont le lien est dans le fichier de param. Si l’envie vous prend, vous pouvez demander une série de thèmes aléatoires. Pour cela, remplacez le thème par random
et liste ensuite ceux que vous souhaitez avoir.
ZSH_THEME="random"
ZSH_THEME_RANDOM_CANDIDATES=(
"robbyrussell"
"agnoster"
)
## au besoin on peut aussi faire une liste d'exclusions
ZSH_THEME_RANDOM_IGNORED=(pygmalion tjkirch_mod)
Ensuite, Oh My Zsh supporte pas mal de plugins. Attention à ne pas trop en activer, vous risqueriez de ralentir votre shell. Par défaut, il propose le plugin git
qui affiche la branche courante sur l’emplacement où vous vous trouvez est un repo Git (et plein d’alias sympa). Dans la capture d’écran en haut de l’article, vous pouvez le voir avec l’information “master”.
Comme pour les thèmes, de nombreux plugins existent. Il s’agit de la variable plugins
du fichier. Ici un exemple avec les plugins kubectl et helm.
plugins=(git)
## pour en rajouter :
plugins=(git kubectl helm)
Attention à ne pas mettre de séparateur autre qu’un espace, sinon vous cassez tout !
Aller un peu plus loin
Par défaut, Oh My Zsh vous proposera chaque semaine de mettre à jour les sources du framework présent sur votre ordinateur. Si cela vous ennuie, vous pouvez les installer en arrière-plan de manière silencieuse.
Toujours dans ~/.zshrc
, modifier l’entrée : DISABLE_AUTO_UPDATE=true
L’outil peut être mis à jour à la demande via la commande omz update
.
omz
Usage: omz <command> [options]
Available commands:
help Print this help message
changelog Print the changelog
plugin <command> Manage plugins
pr <command> Manage Oh My Zsh Pull Requests
theme <command> Manage themes
update Update Oh My Zsh
La plupart des plugins se contentent d’ajouter des commandes supplémentaires pour faire des raccourcis ou d’activer l’auto-completion pour l’outil donné. Par exemple, le plugin kubectl
créé tout un tas d’alias à la commande :
k=kubectl
kaf='kubectl apply -f'
kca='_kca(){ kubectl "$@" --all-namespaces; unset -f _kca; }; _kca'
kccc='kubectl config current-context'
kcdc='kubectl config delete-context'
kcgc='kubectl config get-contexts'
kcn='kubectl config set-context --current --namespace'
(...)
Dans tous les cas, si jamais vous avez besoin de plus d’informations, il suffit d’aller sur le repo de Oh My Zsh.
Enjoy !