La comanda which diu quin fitxer s’executarà quan escriguis una comanda. Busca el nom als directoris de la variable PATH, en ordre, i mostra la ruta del primer executable que troba. És útil per saber si un programa està instal·lat, d’on surt, o quina de dues versions s’està fent servir.
Sintaxi
which [opcions] comanda...
Opcions
A Debian i Ubuntu, which és un script senzill del paquet debianutils, amb només dues opcions:
| Opció | Què fa |
|---|---|
-a | Mostra tots els executables que coincideixen al PATH, no només el primer |
-s | No mostra res; només retorna 0 si les troba totes i 1 si no |
A Fedora, Rocky i AlmaLinux, which és la versió GNU (paquet which, que no sempre ve instal·lat en instal·lacions mínimes i contenidors). Té més opcions, com --version, --read-alias o --skip-dot, però -a funciona igual.
Exemples
On és una comanda:
$ which ls
/usr/bin/ls
Totes les coincidències del PATH. En sistemes on /bin és un enllaç a /usr/bin (tots els actuals), el mateix programa surt dues vegades:
$ which -a ls
/usr/bin/ls
/bin/ls
Diverses comandes alhora:
$ which python3 tar
/usr/bin/python3
/usr/bin/tar
Saber si un programa està instal·lat. Si no el troba, which no mostra res i retorna un codi d’error:
$ which rar
$ echo $?
1
Als scripts, aprofita el codi de retorn per comprovar dependències:
if ! which rsync >/dev/null; then
echo "Cal instal·lar rsync" >&2
exit 1
fi
Veure quina versió d’un programa fas servir quan n’hi ha diverses (per exemple, un Python compilat a mà a /usr/local/bin i el del sistema a /usr/bin):
$ which -a python3
/usr/local/bin/python3
/usr/bin/python3
$ python3 --version
S’executa el primer de la llista, perquè /usr/local/bin va abans al PATH.
Comprovar que un script teu és accessible des del PATH:
which copia-seguretat.sh
which no veu àlies ni funcions: fes servir type
which és un programa extern i només mira fitxers del PATH. No sap res dels àlies, les funcions ni les comandes internes del shell, que tenen prioritat sobre els fitxers. (A Fedora i RHEL hi ha un truc: /etc/profile.d/which2.sh defineix which com un àlies que li passa la llista d’àlies i funcions del shell, i per això allà, en un terminal interactiu, sí que els mostra. A Debian i Ubuntu, no.) Per això, en bash, és més fiable type:
$ alias ll='ls -l'
$ which ll
$ type ll
ll is aliased to `ls -l'
$ type cd
cd is a shell builtin
$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo
I als scripts, la manera recomanada (és POSIX i no depèn de cap programa extern) és command -v:
if ! command -v rsync >/dev/null; then
echo "Cal instal·lar rsync" >&2
fi
Compte amb…
- Si acabes d’instal·lar un programa i
whichencara mostra la ruta antiga (o el shell diu que no existeix), és la memòria cau de rutes de bash: feshash -r. python: a Debian i Ubuntu actuals, la comanda éspython3.which pythonnomés troba res si tens instal·lat el paquetpython-is-python3o un altre Python.
Comandes relacionades
whereis: executable, manual i codi font d’una comanda.locateifind: buscar qualsevol fitxer.- Variables d’entorn a Linux: com funciona el
PATH. - Comandes internes de bash:
type,command,hashi altres.