Être aux commandes de son terminal (Partie 1 : Les outils pour être plus productif)

L’invite de commande est l’outil numéro 1 d’un ingénieur informatique. Même s’il n’est au premier abord qu’un outil secondaire pour la plupart des professionnels en début de carrière, il devient, petit à petit, un outil central de leur quotidien.

Disclaimer : Cet article s'adresse surtout aux débutants qui ne voient pas forcément toute l’ampleur que peut avoir une invite de commande dans leur environnement de travail. L’article n’a pas vocation à rentrer dans les détails.

Disclaimer 2 : Les différents exemples de cet article ont été produits depuis la version 32 de Fedora. Ces derniers doivent aussi fonctionner sur toutes les plus grandes distributions Linux et sur macOS. Pour les utilisateurs Windows, il faudra passer par le sous-système Windows pour Linux (WSL).

L’invite de commande chez un ingénieur junior

Généralement, à nos débuts, l’invite de commande sert avant tout à utiliser différentes CLI (Command Line Interface) pour interagir avec d’autres systèmes via des commandes. C’est par exemple le cas de git ou d’aws. À ce stade de l'évolution d’un ingénieur, votre terminal ressemble très certainement à ceci :

Je suis sur la distribution Fedora mais les informations sont généralement les mêmes à savoir le nom d’utilisateur, ici ddoamaral, ainsi que le chemin actuel dans lequel toute commande sera exécutée, ici représenté par un tilde (~). Tilde est un raccourci pour désigner le répertoire Home de l’utilisateur actuel. Dans mon cas, c’est en réalité juste un alias qui représente le chemin /home/ddoamaral/.

Plus le temps passe, plus l'expérience s’accumule et plus l’invite de commande d’un ingénieur devient une application importante et récurrente. Si récurrente qu’elle est aujourd’hui incluse dans la plupart des éditeurs de code. L’invite de commande se transforme alors en gestionnaire de fichiers et de tâches, en éditeur de code, en outil de monitoring. Elle reste très proche de la machine, à contrario des divers autres outils graphiques, ce qui en fait un outil plus fiable et customisable.

Aujourd’hui, nous allons voir certains de ces aspects qui peuvent vous rendre plus productif.

La trinité : Zsh, Oh my Zsh et PowerLevel10k

L’invite de commande peut être beaucoup plus qu’un simple outil pour lancer des commandes. Généralement, on fait un tel constat avec le besoin d’avoir des informations contextuelles pour une interface donnée. Voici certains exemples qui vont très certainement vous interpeller :

  • Git suppose un certain contexte à la racine d’un projet. Il pourrait être très intéressant de savoir en tout temps la branche dans laquelle nous sommes situés, le nombre de fichiers modifiés depuis le dernier commit, si oui ou non nous sommes situés dans un projet contenant le fameux “.git”, etc.
  • Les environnements virtuels Python. Ces derniers permettent d’importer des librairies Python et ainsi de pouvoir les utiliser dans un projet donné. Malheureusement, il arrive d’avoir plusieurs environnements pour plusieurs projets en parallèle, il est donc utile de savoir à tout moment lequel de ces environnements est actuellement actif.
  • Kubectl exige d’influencer depuis l'invite de commande des clusters Kubernetes définis par deux variables, le nom du cluster ainsi qu’un namespace. Ici encore on peut, sans le faire exprès, déployer des ressources dans le mauvais contexte et l’indiquer est donc un plus.

Il est évident qu’au cours de votre carrière d’ingénieur, vous avez fait/allez faire face à au moins un de ces cas. Fort heureusement, il existe des outils permettant de répondre à cette problématique. Aujourd’hui je vais vous parler d’un ensemble de technologies qui, selon moi, répondent parfaitement à ce besoin. Ainsi, ensemble construisons l’invite de commande 2.0.

Zsh

Zsh est la base de notre nouvelle invite de commande 2.0. C’est un shell, tout comme bash ou PowerShell. Il a comme principal avantage d’avoir une communauté incroyable ayant développé des outils très complets dont certains vont être présentés aujourd’hui.

Si vous ne l’avez pas encore installé, installez-le depuis cette adresse : https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH

Une fois cela fait, on peut taper zsh dans l’invite de commande pour changer de shell ou encore chsh puis renseigner /bin/zsh pour faire de ce dernier votre shell par défaut.

Oh My Zsh

Zsh tout seul ne fait pas une grande différence. Il ajoute tout de même de nombreuses fonctionnalités dont certaines sont décrites ici. Il se base sur le même principe que Linux, à savoir commencer avec le strict minimum et par la suite sélectionner les outils qui nous importent.

Oh My Zsh facilite l’installation de ces derniers à travers deux composantes : les plugins et les thèmes. Pour l'installer, c’est tout aussi simple, il suffit de copier coller la commande suivante :

sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Pour commencer à interagir avec le framework, nous allons tout de suite éditer le fichier .zshrc présent à la racine de notre utilisateur.

À l'intérieur de ce dernier se trouve toute notre configuration zsh. Il faut savoir que toutes les lignes que vous rajouterez dans ce fichier seront exécutées au démarrage de chaque nouvelle invite de commande. Ainsi, si vous rajoutez un echo "Hello ZSH !" au lancement vous obtiendrez une jolie “Hello ZSH !”. Cela vous permet de mettre en place certaines variables d’environnements par exemple. Ainsi, si vous stipulez la ligne suivante : export ENV=1234, vous pouvez utiliser la valeur de la variable d’environnement n’importe où. Les alias sont aussi très intéressants pour gagner du temps. J’utilise par exemple ce dernier pour jump de mon terminal à ma fenêtre visual studio code : alias code.="code . && exit".

On va tout d’abord s'intéresser aux plugins ici. Ces derniers permettent d'ajouter des fonctionnalités à votre console. Dans le fichier .zshrc, on remarque déjà un plugin installé : le plugin git. Ce dernier rajoute énormément d’alias pour gagner du temps lorsqu’on utilise le CLI git. Pour en savoir plus, voici la liste exhaustive de ces derniers : https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git. Bien évidemment, on peut ici en rajouter beaucoup plus, qui vont tous rendre votre expérience avec l’invite de commande plus agréable. Ainsi, je ne saurais trop vous conseiller de rajouter au moins les suivants :

  • autojump → il permet de voyager vers un dossier souvent utilisé sans devoir taper tout le chemin vers ce dernier. Ainsi, si vous accédez souvent à un dossier qui se trouve à ce chemin : a/b/c/d/my-project vous pourrez y accéder via j my-project et pourquoi pas ensuite enchaîner avec votre alias code. pour directement ouvrir votre projet dans visual studio code.
  • zsh-completions →  il permet une auto complétion plus que plaisante. La complétion est l’art de proposer à l’utilisateur les différentes possibilités qu’il peut entrevoir lorsqu’il tape une commande en particulier. Par exemple, si on tape la commande cd avec un espace on s’attend par la suite à avoir besoin d’un dossier se trouvant à la racine dans laquelle se trouve l’invite de commande. Pour savoir quels dossiers sont disponibles, on peut tout d’abord lancer la commande ls puis taper le nom précédemment inscrit ou alors on peut saisir la commande cd suivie d’un espace puis appuyer sur la touche SHIFT pour se laisser guider par la console qui va successivement vous présenter toutes les possibilités disponibles. Le plugin en plus de cette fonctionnalité native ajoute le même fonctionnement avec les makefiles, git, etc.
  • zsh-autosuggestions → à l’instar de gmail et de sa complétion automatique, l’invite de commande vous proposera la commande qui lui est la plus pertinente. Une image vaut mieux que mille mots :

Il existe pléthore d’autres plugins, spécifiques à un certain CLI, ajoutant généralement deux choses : la complétion et des alias. Ainsi si vous utilisez maven, il y a le plugin mvn. Si vous utilisez Kubernetes, il y a le plugin kubectl, etc.

Maintenant que notre invite de commande est intelligente, nous allons la rendre belle et encore plus utile ! C’est à ce moment-là qu’entre en jeu les thèmes et plus particulièrement PowerLevel10k.

PowerLevel10k

On n’oublie pas ce qui nous a amené jusqu’ici, le besoin d’avoir affiché constamment sur notre console des contextes particuliers. On veut savoir sur quelle branche on se trouve lorsqu’on est dans un projet git, on veut savoir dans quel cluster et dans quel namespace on se trouve si on manipule des clusters Kubernetes, etc. Tout ceci va être possible grâce à PowerLevel10k.

Rendez-vous sur ce lien : https://github.com/romkatv/PowerLevel10k.

Protip : n’oubliez pas d’installer aussi la font “meslo-nerd-font-patched-for-PowerLevel10k” pour une expérience utilisateur agréable.

La première fois que vous lancerez votre nouvelle console, vous aurez à customiser votre invite de commande. Si jamais cela ne fonctionne pas, veuillez saisir la commande p10k configure. Dans le cas où vous voulez la même configuration que celle qui va suivre, il vous suffit de dire “yes” pour tous les symboles (normalement il n’y aura pas de problème avec la bonne police d’écriture) puis sélectionnez lean(1) → Unicode(1) → 256 colors(1) → No (1) → Two lines (2) → Disconnected (1) → No frame (1) → Sparse (2) → Many icons (2) → Concise (1) → Yes (y).

Normalement, vous obtiendrez quelque chose de la sorte :

La console n’est plus du tout la même et ce, pour le plus grand plaisir de nos yeux ! Si on décortique les informations ci-dessus, pour l’instant on n’a pas grand chose. On a d’abord un logo, ici Fedora car je suis sur cette distribution. On a ensuite deux segments, chaque segment est généralement caractérisé par deux composants, une icône et une information. Ici, le chemin dans lequel nous nous trouvons à gauche est représenté par une maison et le tilde.

Maintenant plaçons-nous dans un projet utilisant le système git ainsi qu’un environnement virtuel Python particulier. Une fois à l'intérieur, voici à quoi devrait ressembler votre console :

Le voilà le contexte que l’on voulait tant depuis le début. Ici nous avons beaucoup plus d’informations sur notre projet en cours, à savoir l’environnement virtuel utilisé actuellement “article” représenté avec l'icône Python ainsi que les informations sur git, à savoir que l’on est sur la branche master et que la branche a 1 fichier ajouté. Cela fait gagner énormément de temps, plus besoin de git status ou autre !

Il nous reste un dernier contexte que l’on avait mentionné dans l’introduction, le contexte sur le cluster Kubernetes en cours. Il faut taper la commande kubectl pour le voir s’afficher. Vous verrez ainsi apparaître la fameuse barre suivante du nom du cluster, ici le cluster à noeud unique en local minikube. Normalement, ce dernier est succédé d’un “/” suivi du nom du namespace mais comme ce dernier est “default” il est omis par PowerLevel10k.

Un champ de possibilités infini

Cette suite d’outils est selon moi un très bon point d’entrée pour faire connaissance avec votre invite de commande et apprendre à l’apprécier à sa juste valeur. On pourrait bien entendu ne pas s'arrêter là, parler du fuzzy finder, mentionner Vim et son univers bien à lui, parler de taskwarrior qui est selon moi un des meilleurs gestionnaires de tâches, introduire tmux pour avoir plusieurs fenêtres dans la même console. Si vous êtes intéressés par ces derniers, veuillez vous référer à la partie “pour aller plus loin”. Les possibilités sont infinies.

PowerLevel10k est une des pierres angulaires de cette trinité, de plus, il est très facilement customisable. Ainsi nous allons dans une deuxième partie créer nos propres segments PowerLevel10k pour avoir toujours plus d’insight (ce serait vraiment bien de pouvoir monitorer les ressources de son compte AWS depuis notre console 😉).

Pour aller plus loin