Linux / Commande which : trouver un exécutable dans PATH
which recherche un nom de programme dans les répertoires de PATH et affiche, en général, le premier exécutable trouvé. Cette réponse aide à repérer un fichier installé, mais ne suffit pas toujours à dire ce que votre shell exécute : un alias, une fonction ou une commande interne peut passer avant ce fichier. Pour diagnostiquer le shell courant, utilisez aussi type ou command -v.
Les variantes de which n'offrent pas toutes les mêmes options. La page de manuel du paquet gnu-which dans Debian décrit notamment -a et des options particulières de gestion des alias ; la spécification POSIX de command définit command -v et -V. Vérifiez localement avec type which puis which --help ou man which.
Ce que which trouve dans PATH
PATH est une liste de répertoires séparés par des deux-points que le shell utilise pour chercher des commandes externes. Dans une utilisation ordinaire, which nom parcourt ces répertoires dans l'ordre et indique le premier fichier exécutable correspondant. Le chemin exact dépend donc de la machine et du PATH en cours.
printf '%s\n' "$PATH"
which sh
which awk sed
La première ligne montre les répertoires de recherche. Les suivantes indiquent des chemins seulement si ces programmes sont présents et visibles dans PATH. L'absence de résultat ne prouve pas qu'un paquet est absent du système : son exécutable peut se trouver hors de PATH, et un nom de commande peut être une fonction ou une commande interne sans fichier de ce nom.
Observer l'ordre des chemins avec un exemple contrôlé
Ce petit exercice crée deux scripts portant le même nom dans deux nouveaux sous-dossiers de votre répertoire personnel. Il modifie PATH uniquement dans le shell où vous tapez ces lignes ; il n'écrase aucun programme système. Exécutez les deux blocs dans le même shell pour conserver la variable lab.
lab=$(mktemp -d "$HOME/which-lab.XXXXXX") || exit 1
mkdir -p -- "$lab/premier" "$lab/second"
printf '#!/bin/sh\nprintf "premier\\n"\n' > "$lab/premier/atelier_demo"
printf '#!/bin/sh\nprintf "second\\n"\n' > "$lab/second/atelier_demo"
chmod u+x -- "$lab/premier/atelier_demo" "$lab/second/atelier_demo"
ancien_path=$PATH
PATH="$lab/premier:$lab/second:$ancien_path"
export PATH
Les deux fichiers n'ont d'autre effet que d'afficher leur nom. Avec cet ordre de recherche, la première copie doit être choisie :
which atelier_demo
command -v atelier_demo
atelier_demo
which -a atelier_demo
Les deux premières commandes doivent indiquer le script du dossier premier, et son exécution doit afficher « premier ». Si votre implémentation accepte -a, la dernière commande affiche les deux chemins dans l'ordre : premier, puis second. Si -a n'est pas accepté, consultez l'aide de votre version au lieu d'en déduire que le second fichier n'existe pas.
Pour voir l'effet de la priorité, échangez les deux dossiers dans PATH : PATH="$lab/second:$lab/premier:$ancien_path". Une nouvelle exécution d'atelier_demo doit alors afficher « second ». Revenez à la valeur d'origine avec PATH=$ancien_path; export PATH. Le dossier de pratique peut être conservé pour inspection puis retiré manuellement après vérification de son chemin.
Pourquoi le résultat peut différer de la commande saisie
which peut être un programme externe, un alias ou une fonction fournie par la distribution ou par votre configuration. Certaines variantes GNU savent lire les alias ou les fonctions transmis en entrée standard ; d'autres recherchent seulement des fichiers. Le même nom peut donc produire des réponses différentes sur deux systèmes. La page de manuel de GNU which citée plus haut décrit ces extensions, mais elles ne constituent pas une syntaxe universelle.
Dans Bash, créez une fonction du même nom que le script de pratique et examinez les réponses :
atelier_demo() { printf 'fonction\n'; }
type -a atelier_demo
command -V atelier_demo
command -v atelier_demo
atelier_demo
type -a doit montrer la fonction et les chemins exécutables qu'il trouve ; command -V décrit l'interprétation du nom, tandis que command -v produit une représentation plus courte. L'appel direct doit afficher « fonction ». Un which atelier_demo qui n'inspecte que PATH peut encore indiquer le fichier du dossier premier : cette différence n'est pas une contradiction, les outils ne répondent pas à la même question.
Pour revenir au comportement précédent du shell, utilisez unset -f atelier_demo puis PATH=$ancien_path; export PATH. Dans un shell où des alias ont été définis, type permet aussi de les reconnaître. Une commande interne comme cd n'a généralement pas d'exécutable correspondant à ce nom dans PATH.
Choisir which, type ou command -v
| Outil | Question utile | Limite |
|---|---|---|
which nom |
Où se trouve l'exécutable dans PATH ? |
L'implémentation et le traitement des fonctions ou alias varient. |
which -a nom |
Quels exécutables homonymes sont visibles dans PATH ? |
-a n'est disponible que si l'implémentation le prend en charge. |
type -a nom |
Quels types de résolution Bash connaît-il pour ce nom ? | type -a est une syntaxe de shell, pas un format POSIX universel à analyser. |
command -v nom |
Le shell courant reconnaît-il ce nom et sous quelle forme courte ? | La sortie peut être le nom d'une fonction ou un alias, pas nécessairement un chemin. |
command -V nom |
Comment le shell décrit-il le nom ? | Le texte détaillé est destiné à la lecture humaine et son format varie. |
Pour savoir si une commande est utilisable dans un script sh, testez l'état de command -v plutôt que d'analyser le texte de which :
if command -v curl >/dev/null 2>&1; then
printf 'curl est disponible dans cet environnement\n'
else
printf 'curl est introuvable dans cet environnement\n' >&2
fi
Ce test ne garantit pas que curl fonctionne, qu'il s'agit de la version attendue ou qu'il pointe vers un fichier sûr. Avant une tâche sensible, vérifiez le type de commande, le chemin et la version réellement choisis dans le même environnement d'exécution. Un script lancé avec un PATH différent de votre terminal peut obtenir un autre résultat.
Vérifier les options et éviter les conclusions trompeuses
La forme which [OPTION]... NOM... peut accepter plusieurs noms, mais les détails de sortie et le code de retour ne sont pas uniformes entre variantes. La page GNU citée plus haut documente --all/-a, --read-alias, --read-functions et --skip-alias ; n'utilisez ces options spéciales qu'après avoir confirmé que votre which les propose. Même la commande which --version n'est pas assurée partout.
Un chemin trouvé ne certifie ni l'origine, ni les permissions appropriées, ni l'intégrité d'un programme. Inversement, aucun chemin trouvé ne démontre pas qu'une fonctionnalité est inutilisable : le shell peut fournir une commande interne. Pour chercher la source ou la page de manuel en plus d'un binaire, whereis répond à une autre question que la recherche dans PATH.
Questions fréquentes
Pourquoi which ne trouve-t-il pas cd ?
cd est généralement une commande interne du shell. type cd ou command -V cd décrit ce que votre shell reconnaît, même si aucun fichier exécutable cd n'est présent dans PATH.
Comment voir toutes les copies d'un exécutable ?
Si votre implémentation le prend en charge, utilisez which -a NOM, puis comparez leur ordre à celui des répertoires dans PATH.
command -v renvoie-t-il toujours un chemin absolu ?
Non. Selon la nature du nom, la spécification POSIX permet aussi un nom de fonction, de commande interne ou une définition d'alias. Utilisez son état de sortie pour tester la présence, pas la forme du texte comme preuve qu'il s'agit d'un fichier.
La référence des commandes Linux par tâche replace which parmi les outils de localisation et de diagnostic des commandes.




