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.