Aller au contenu
Jérémy Le Piolet - Blog

Accélérer la navigation avec CDPATH

Dans la grande famille des petits trucs et astuces un peu obscurs qui peuvent nous changer la vie quand on les connait, j'ai découvert dernièrement la variable CDPATH.

Pour faire court, cette variable permet de rendre accessible depuis la commande cd des répertoires qui ne seraient pas dans la répertoire courant. Une sorte de téléporteur qui permet d'aller en raccourci à des endroits spécifiques, sans se soucier de notre origine.

Qu'est ce que ça résoud pour moi ?

Sur mon poste, j'ai un gros dossier Projets dans lequel j'ai, surprise, l'ensemble des projets sur lesquels je travaille. Pour accéder à un projet depuis la ligne de commande, je suis obligé de taper ce genre de commande :

$ cd ~/Projets/projet-A
$ cd ~/Projets/projet-b

Autant dire que ça fait beaucoup de caractères à taper et à se rappeler à chaque fois. D'autant que le tilde n'est pas forcément le caractère le plus aisé à atteindre. Et ça, c'est quand je fais l'effort mental de me rappeler que c'est plus court de partir du HOME parce qu'il m'arrive aussi de partir à l'aventure à coup de cd ../../../...

Ce serait quand même plus pratique si, n'importe où je suis, je pouvais faire

$ cd projet-A
$ cd projet-b

C'est possible grâce à CDPATH.

CDPATH est une variable d'environnement qui va permettre d'ajouter des répertoires dans la liste des répertoires que peut scanner la commande cd. Le même fonctionnement que la variable PATH mais qui ne s'applique qu'à la navigation à travers cd : on va d'abord regarder dans le répertoire courant puis aller chercher dans la liste ensuite pour trouver un matching potentiel.

Concrètement, ça va se traduire par l'ajout d'une ligne de configuration dans un .bashrc :

export CDPATH=.:$HOME/Projets

où :

  • On conserve le . pour dire qu'il faut d'abord chercher dans le répertoire courant (au premier élément qui matche, la commande s'arrête donc c'est plus pertinent de mettre le répertoire courant en premier)
  • On cherche dans $HOME/Projets le cas échéant si un répertoire matche.
  • Chaque répertoire de recherche est séparé par des :

Si aucun répertoire ne correspond, cd retournera une erreur classique.

On peut améliorer le CDPATH selon ses besoins. Rien n'interdit par exemple d'avoir ce genre de valeur :

export CDPATH=.:$CDPATH:$HOME:$HOME/Projets:..

avec :

  • les anciennes valeurs de CDPATH qui sont prises en compte
  • l'ajout du HOME ou tout autre répertoire pertinent
  • l'ajout du répertoire précédent (..) pour des recherches plus haute dans l'arborescence.

Le rajout du répertoire courant n'est pas obligatoire si vous êtes sûrs qu'il est présent dans la valeur de CDPATH.

Si cette variable semble pratique au premier abord, il faut néanmoins faire attention dans son utilisation.

D'une part, ajouter trop de dossiers rendra la navigation par cd plus lourde et longue, le nombre de dossier à scanner à chaque fois étant important.

D'autre part, il faut s'assurer que les dossiers scannables aient des noms distincts. Par exemple, avec l'ajout de répertoires comme /usr/bin, /bin et /sbin, il y a des chances qu'on se retrouve avec plusieurs fois le même nom de répertoire à des emplacements différents. À ce moment-là, cd choisira le premier répertoire dans la liste de CDPATH (avec risque de ne pas tomber au bon endroit).

Dans mon cas, mes projets ayant des noms uniques et assez éloignés des nommages standards, pas trop de risque (et je n'ajoute que mon répertoire projet).

Dernier point, l'autocomplétion n'est pas forcément native selon la version du shell. Ce qui, dans le cas de nom de projet un peu longuet, peut être source d'erreur et un peu compliqué à taper (coucou le projet dashboard-rh-formation, pas du tout long à écrire sans faire de faute de frappe).

Pour cela, je suis tombé sur un exemple d'autocomplétion dans le manuel bash à cette adresse https://www.gnu.org/software/bash/manual/html_node/A-Programmable-Completion-Example.html. La page fait référence à un projet complet qui propose de nombreuses fonctions de complétion pour diverses commandes. Mais en version simple, les deux exemples listés sur la page feront le job, à ajouter dans la configuration .bashrc.

Pour conclure, si les besoins de navigations avec cd sont plus poussés, il existe de nombreuses commandes et raccourcis pour cela :

  • https://en.wikipedia.org/wiki/Pushd_and_popd pour de l'empilement de répertoire (usage très avancé quand même)
  • des alias pour l'accès rapide à des répertoires spécifiques
  • la maîtrise des raccourcis : cd seul ramène vers HOME, cd - ramène au répertoire précédent (à ne pas confondre avec le ..), etc.
  • https://manpages.org/cd et plus si affinité dans la documentation de cd (vous pouvez y trouver également CDPATH)