Comment utiliser la commande which sous Linux



Cette instruction Linux permet d’identifier l’exécutable qui est lancé lorsqu’une commande est saisie dans le shell. Si plusieurs versions du même programme coexistent sur votre machine, vous pouvez déterminer quelle version le shell utilisera.

Exécutables et Répertoires

Lorsque vous lancez une commande ou un programme depuis votre terminal, le shell (souvent Bash dans les distributions modernes) doit localiser cette commande et l’exécuter. Certaines commandes, comme cd, history, et pwd, sont intégrées au shell et ne nécessitent pas de recherche particulière par Bash.

Comment Bash retrouve-t-il les autres commandes, programmes ou exécutables autonomes ? Il utilise le « chemin », une liste de répertoires. Il explore chaque répertoire de cette liste jusqu’à trouver un exécutable correspondant à la commande ou au programme que vous essayez de lancer. Une fois trouvé, Bash l’exécute et interrompt la recherche.

Vous pouvez visualiser la variable d’environnement $PATH, qui contient cette liste de répertoires, avec la commande suivante :

echo $PATH

Les répertoires sont séparés par des deux-points (:). Un exemple d’ordre de recherche serait :

/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin

La présence de multiples répertoires nommés /sbin et /bin peut parfois induire en erreur.

Analyse des Chemins

Imaginons que nous possédons une version améliorée d’un programme appelé htg, située dans le répertoire courant. On peut l’exécuter avec la commande :

./htg

Ce programme affiche simplement un numéro de version (1.2.138) et se termine.

Pour exécuter un programme présent dans le répertoire de travail, il faut utiliser ./ suivi du nom, indiquant à Bash où le trouver.

Afin de pouvoir lancer ce programme depuis n’importe quel emplacement, déplaçons l’exécutable dans le répertoire /usr/bin. Bash le trouvera dans le « chemin » et l’exécutera. Nous n’aurons plus besoin de le lancer avec ./ .

sudo mv htg /usr/bin

Essayons de l’exécuter simplement en tapant :

htg

Le programme s’exécute, mais ce n’est pas notre version mise à jour, c’est l’ancienne (1.2.105).

L’utilité de la commande which

Ce problème illustre l’intérêt de la commande which. Cette commande permet de déterminer quel fichier exécutable sera lancé par le shell.

Utilisons which en passant le nom du programme comme paramètre :

which htg

La commande which nous révèle que la version de htg utilisée se trouve dans /usr/local/bin. Puisque ce répertoire est prioritaire dans le « chemin » par rapport à celui où nous avons déplacé la nouvelle version, c’est cette ancienne version qui est lancée.

En utilisant l’option -a (all), la recherche continue même après la première correspondance :

which -a htg

La commande liste toutes les correspondances trouvées dans les répertoires du chemin.

Nous avons identifié le problème : une ancienne version du programme existe dans un répertoire qui est prioritaire dans le chemin de recherche. Pour confirmer, nous pouvons exécuter explicitement les deux versions du programme :

/usr/local/bin/htg
/usr/bin/htg

Le problème est maintenant clairement identifié. La solution est simple : soit supprimer l’ancienne version dans /usr/local/bin, soit déplacer la nouvelle version de /usr/bin vers /usr/local/bin.

L’interprétation des résultats

Deux résultats ne signifient pas systématiquement deux exécutables distincts.

Prenons l’exemple de la commande less. Analysons ses emplacements avec l’option -a:

which -a less

La commande indique deux emplacements pour less. Est-ce plausible ? Il serait étrange d’avoir deux versions différentes de less installées. Approfondissons notre investigation.

Utilisons ls avec les options -l (liste longue) et -h (taille lisible) :

ls -lh /usr/bin/less

La taille indiquée est de 9 octets ! Ce n’est pas une copie complète de less.

Le premier caractère de la liste est un l. Un fichier normal aurait un tiret (-). Le l indique qu’il s’agit d’un lien symbolique. Le symbole -> le confirme. Il pointe vers la véritable copie de less située dans /bin.

Analysons la version de less dans /bin :

ls -lh /bin/less

Il s’agit bien d’un exécutable binaire : le premier caractère est - et sa taille est de 167 Ko. Il n’y a qu’une seule copie de less. Le lien symbolique dans /usr/bin est simplement un « raccourci » que Bash trouve lors de la recherche dans le « chemin ».

Vérification de multiples commandes

La commande which peut vérifier plusieurs programmes ou commandes simultanément :

which ping cat uptime date head

La commande examine chaque élément fourni et affiche les résultats correspondants.

Réflexion sur which

On peut même utiliser la commande which pour déterminer son propre emplacement :

which which

Au-delà de la curiosité, which devient utile lorsqu’une commande ou un programme ne se comporte pas comme attendu. Dans ces situations, vous pouvez vérifier que le programme lancé par Bash est bien celui que vous souhaitez utiliser.