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.
⚠️
whichne fonctionne que pour les exécutables (binaires, scripts) et non pour les alias, fonctions shell, ou commandes internes (commecd,echo, etc.).
📌 Syntaxe
which [OPTIONS] [--] COMMANDE...
🎛️ Options principales
| Option | Description |
|---|---|
-a | Affiche toutes les correspondances dans $PATH (et non seulement la première). |
--skip-alias | Ignore les alias (par défaut, which peut les afficher). |
--skip-dot | Ignore les répertoires . (courant) dans $PATH. |
--skip-tilde | Ignore les répertoires ~ (home) dans $PATH. |
--show-dot | Affiche explicitement . si la commande est trouvée dans le répertoire courant. |
--show-tilde | Affiche explicitement ~ si la commande est trouvée dans le répertoire home. |
-v, --version | Affiche la version de which. |
--help | Affiche 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ème | Solution |
|---|---|
which ne trouve pas les alias ou fonctions shell | Utilisez type ou command -v (built-in Bash). |
which ne cherche que dans $PATH | Utilisez 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 standard | Modifiez $PATH ou utilisez find/locate. |
🔄 Alternatives à which
| Commande | Description | Exemple |
|---|---|---|
type | Affiche le type (alias, fonction, fichier) et le chemin si exécutable. | type ls → ls is aliased to 'ls --color=auto' |
command -v | Similaire à type -P (affiche le chemin ou rien). | command -v python → /usr/bin/python |
whereis | Cherche dans $PATH, /usr/share/man, /usr/share/info. | whereis python → python: /usr/bin/python /usr/share/man/man1/python.1.gz |
which -a | Affiche 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
whichest une commande externe (généralement/usr/bin/whichou/bin/which).- Elle dépend de
$PATH: Si un répertoire n’est pas dans$PATH,whichne le cherchera pas. - Elle ignore les commandes internes du shell (comme
cd,echo,exit).
→ Utiliseztypeouhelppour ces cas. - Sous Linux,
whichpeut être remplacé parcommand -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 -vest plus fiable quewhichdans les scripts (évite les problèmes de portabilité).
📚 Pour aller plus loin
- Man page :
man which(Linux/macOS). - Documentation GNU : https://www.gnu.org/software/which/
- Variable
$PATH:echo $PATHpour voir les répertoires recherchés.