Cercar fitxers a LinuxComandes LinuxLinux

La comanda which a Linux: quin programa s’executa



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
-aMostra tots els executables que coincideixen al PATH, no només el primer
-sNo 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 which encara mostra la ruta antiga (o el shell diu que no existeix), és la memòria cau de rutes de bash: fes hash -r.
  • python: a Debian i Ubuntu actuals, la comanda és python3. which python només troba res si tens instal·lat el paquet python-is-python3 o un altre Python.

Comandes relacionades