Localiser l’emplacement du fichier exécutable d’une commande avec which

Description

La commande which permet de localiser l’emplacement du fichier exécutable d’une commande donnée dans les répertoires listés dans la variable d’environnement $PATH.
Elle affiche le chemin absolu de l’exécutable appelé quand vous tapez une commande dans le terminal.

⚠️ which ne fonctionne que pour les exécutables (binaires, scripts) et non pour les alias, fonctions shell, ou commandes internes (comme cd, echo, etc.).


📌 Syntaxe

which [OPTIONS] [--] COMMANDE...

🎛️ Options principales

OptionDescription
-aAffiche toutes les correspondances dans $PATH (et non seulement la première).
--skip-aliasIgnore les alias (par défaut, which peut les afficher).
--skip-dotIgnore les répertoires . (courant) dans $PATH.
--skip-tildeIgnore les répertoires ~ (home) dans $PATH.
--show-dotAffiche explicitement . si la commande est trouvée dans le répertoire courant.
--show-tildeAffiche explicitement ~ si la commande est trouvée dans le répertoire home.
-v, --versionAffiche la version de which.
--helpAffiche l’aide.

💡 Exemples d’utilisation

1. Localiser une commande simple
which ls

Sortie possible :

/bin/ls
2. Trouver toutes les occurrences d’une commande




which -a python

Sortie possible :

/usr/bin/python
/usr/local/bin/python
3. Vérifier si une commande existe
which nonexistent_command

Sortie possible :

which: no nonexistent_command in (/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin)

Aucun chemin affiché = la commande n’est pas dans $PATH.


4. Utiliser avec plusieurs commandes
which ls cp mv

Sortie possible :

/bin/ls
/bin/cp
/bin/mv

🔍 Cas d’usage typiques

Vérifier où est installé un programme (ex: node, python, git).
Déboguer des problèmes de PATH (ex: pourquoi une commande n’est pas trouvée).
Vérifier les conflits de versions (ex: /usr/bin/python vs /usr/local/bin/python).
Automatiser des scripts (ex: vérifier qu’une dépendance est installée).


⚠️ Limitations et alternatives

ProblèmeSolution
which ne trouve pas les alias ou fonctions shellUtilisez type ou command -v (built-in Bash).
which ne cherche que dans $PATHUtilisez whereis pour chercher aussi dans /usr/share/man, /usr/share/info, etc.
Besoin de plus de détails (permissions, type de fichier)Utilisez command -V ou file $(which COMMANDE).
Rechercher dans des répertoires non standardModifiez $PATH ou utilisez find/locate.

🔄 Alternatives à which
CommandeDescriptionExemple
typeAffiche le type (alias, fonction, fichier) et le chemin si exécutable.type lsls is aliased to 'ls --color=auto'
command -vSimilaire à type -P (affiche le chemin ou rien).command -v python/usr/bin/python
whereisCherche dans $PATH, /usr/share/man, /usr/share/info.whereis pythonpython: /usr/bin/python /usr/share/man/man1/python.1.gz
which -aAffiche toutes les occurrences dans $PATH.which -a gcc/usr/bin/gcc
readlink -f $(which COMMANDE)Affiche le chemin absolu résolu (sans liens symboliques).readlink -f $(which python)/usr/bin/python3.10

📝 Notes importantes

  • which est une commande externe (généralement /usr/bin/which ou /bin/which).
  • Elle dépend de $PATH : Si un répertoire n’est pas dans $PATH, which ne le cherchera pas.
  • Elle ignore les commandes internes du shell (comme cd, echo, exit).
    → Utilisez type ou help pour ces cas.
  • Sous Linux, which peut être remplacé par command -v (plus portable et intégrée à Bash).

🛠️ Exemple avancé : Vérifier si une commande existe dans un script

if command -v git >/dev/null 2>&1; then
    echo "Git est installé en : $(command -v git)"
else
    echo "Git n'est pas installé ou n'est pas dans \$PATH."
fi

command -v est plus fiable que which dans les scripts (évite les problèmes de portabilité).


📚 Pour aller plus loin


Voir également

La commande ldd (List Dynamic Dependencies) sous Bash

Retour en haut