Fatmawati Achmad Zaenuri / Shutterstock
Le Linux which
command identifie l’exécutable binaire qui se lance lorsque vous émettez une commande vers le shell. Si vous avez différentes versions du même programme sur votre ordinateur, vous pouvez utiliser which
pour savoir lequel le shell utilisera.
Binaires et chemins
Lorsque vous essayez d’exécuter un programme ou une commande à partir de la fenêtre du terminal, le shell (généralement, Frapper sur les distributions modernes) doit trouver cette commande et la lancer. Certaines commandes, telles que CD, histoire, et pwd, sont intégrés au shell, donc Bash n’a pas à travailler trop dur pour les trouver.
Mais comment Bash localise-t-il d’autres commandes, programmes et binaires externes autonomes? Eh bien, Bash utilise le chemin, qui est en fait une collection de chemins, chacun pointant vers un répertoire. Il recherche ensuite dans chacun de ces répertoires un exécutable qui correspond à la commande ou au programme que vous essayez d’exécuter. Lorsqu’il en trouve un, Bash le lance et abandonne la recherche.
Vous pouvez utiliser echo
pour vérifier le $PATH
variable d’environnement et voir les répertoires dans votre chemin. Pour ce faire, tapez ce qui suit, puis appuyez sur Entrée:
echo $PATH
La liste de sortie sépare chaque chemin par des deux-points (:). Sur l’ordinateur que nous utilisons, Bash recherchera les répertoires suivants dans cet ordre:
-
/usr/local/sbin
-
/usr/local/bin
-
/usr/sbin
-
/usr/bin
-
/sbin
-
/bin
-
/user/games
-
/usr/local/games
-
/snap/bin
Il existe de nombreux dossiers appelés /sbin
et /bin
dans le système de fichiers, ce qui peut prêter à confusion.
Regardez ces chemins
Disons que nous avons une version mise à jour d’un programme appelé htg
. Il se trouve dans notre répertoire actuel et nous pouvons l’exécuter en tapant la commande suivante:
./htg
Ce n’est pas vraiment un programme – il imprime simplement le numéro de version, puis se ferme. La nouvelle version est la 1.2.138.
Pour exécuter un programme dans le répertoire de travail actuel, vous devez taper «./» devant le nom du programme, afin que Bash sache où le trouver.
Parce que nous voulons exécuter ce programme particulier à partir de n’importe quel répertoire, nous allons déplacer l’exécutable dans le /usr/bin
annuaire. Bash trouvera ce programme dans le chemin et l’exécutera pour nous.
Nous n’avons pas besoin de l’exécutable dans notre répertoire actuel, ni de taper «./» devant le nom du programme, comme indiqué ci-dessous:
sudo mv htg /usr/bin
Maintenant, essayons d’exécuter le programme en tapant:
htg
Quelque chose fonctionne, mais ce n’est pas notre nouveau programme mis à jour. Il s’agit plutôt de l’ancienne version, 1.2.105.
La commande quelle
Le problème que nous avons démontré ci-dessus est pourquoi le which
commander a été conçu.
Dans cet exemple, nous utiliserons which
et passez le nom du programme que nous étudions en tant que paramètre de ligne de commande:
which htg
which
signale qu’il a trouvé une version de htg
dans le /usr/local/bin
annuaire. Parce que cet emplacement apparaît dans le chemin avant le répertoire vers lequel nous avons déplacé la mise à jour htg
, Bash utilise cette version antérieure du programme.
Cependant, si nous utilisons le -a
(tous) option comme indiqué ci-dessous, which
continue la recherche même s’il trouve une correspondance:
which -a htg
Il répertorie ensuite toutes les correspondances dans l’un des répertoires du chemin.
Voilà donc le problème: il existe une version antérieure du programme dans un répertoire qui se trouve également dans le patch. Et ce répertoire est recherché avant le répertoire dans lequel nous avons déposé la nouvelle version du programme.
Pour vérifier, nous pouvons taper ce qui suit et exécuter explicitement chaque version du programme:
/usr/local/bin/htg
/usr/bin/htg
Cela explique le problème et la solution est simple.
En fait, nous avons des options. Nous pouvons soit supprimer l’ancienne version dans le /use/local/bin
répertoire ou déplacez-le de /usr/bin
à /usr/local/bin
.
Regardez ces résultats
Deux résultats ne signifient pas nécessairement deux fichiers binaires.
Regardons un exemple dans lequel nous utiliserons le which
commande avec la -a
(all) et recherchez les versions de less
programme:
which -a less
which
signale deux emplacements qui hébergent une version du less
programme, mais est-ce vrai? Il serait étrange d’avoir deux versions différentes (ou la même version à plusieurs endroits) de less
installé sur un ordinateur Linux. Donc, nous n’accepterons pas la sortie de which
. Au lieu de cela, creusons un peu plus profondément.
Nous pouvons utiliser le ls
, -l
(liste longue), et -h
(lisibles par l’homme) pour voir ce qui se passe:
ls -lh /usr/bin/less
La taille du fichier est indiquée comme neuf octets! Ce n’est certainement pas une copie complète de less
.
Le premier caractère de la liste est un «l». Un fichier normal aurait un tiret (-) comme premier caractère. Le «l» est un symbole qui signifie. Si vous avez manqué ce détail, le -->
le symbole indique également qu’il s’agit d’un lien symbolique, que vous pouvez considérer comme une sorte de raccourci. Celui-ci pointe vers la copie de less
dans /bin
.
Essayons à nouveau avec la version de less
dans /bin
:
ls -lh /bin/less
Cette entrée est évidemment un exécutable binaire «réel». Le premier caractère de la liste est un tiret (-), ce qui signifie qu’il s’agit d’un fichier normal et que la taille du fichier est de 167 Ko. Donc, une seule copie de less
est installé, mais il y a un lien symbolique vers celui-ci depuis un autre répertoire, que Bash trouve également lorsqu’il recherche le chemin.
Vérification de plusieurs commandes à la fois
Vous pouvez transmettre plusieurs programmes et commandes à which
, et il les vérifiera dans l’ordre.
Par exemple, si vous tapez:
which ping cat uptime date head
which
fonctionne à travers la liste des programmes et des commandes que vous lui avez fournis et répertorie le résultat pour chacun d’eux.
Lequel qui est quoi?
Si vous le souhaitez, vous pouvez également utiliser which
sur lui-même en tapant ce qui suit:
which which
En plus de fouiller dans le système de fichiers Linux par curiosité, which
est plus utile lorsque vous attendez un ensemble de comportements d’une commande ou d’un programme, mais que vous en obtenez un autre.
Vous pouvez utiliser which
dans ces cas, pour vérifier que la commande que Bash lance est celle que vous souhaitez utiliser.