Comando which in Linux: trovare eseguibili in PATH e confrontare type e command -v

which cerca un eseguibile nelle directory di PATH e ne mostra il percorso. È utile per individuare un programma esterno; per sapere come la shell corrente interpreta un nome, inclusi alias, funzioni e comandi interni, usa anche type o command -v.

Prima di seguire gli esempi, identifica il comando disponibile con type which, poi consulta which --help e man which. Le opzioni lunghe descritte qui sono quelle di GNU which: un’altra implementazione o una funzione chiamata which può comportarsi diversamente. Gli esempi con type -a e la prova di PATH richiedono Bash.

Cos'è il comando which?

PATH è una lista di directory separate da due punti. La ricerca normale di un programma esterno controlla le directory nell’ordine indicato e seleziona il primo candidato eseguibile. Il programma which non conosce automaticamente tutto lo stato della shell: alias, funzioni, comandi interni e percorsi memorizzati possono rendere diverso il comando realmente scelto.

Sintassi di base

which [OPTION]... COMMAND...

OPTION e COMMAND sono segnaposto. Passa nomi di comandi, non pattern per cercare tutto il disco. Una ricerca senza corrispondenze non dimostra che il programma sia assente dal sistema: può essere installato in una directory fuori da PATH o non risultare eseguibile per l’utente. Leggi anche gli errori e lo stato di uscita.

Uso base di which

Trovare il percorso di un eseguibile

Il comando seguente cerca python3 nel PATH attuale. Se lo trova, stampa un percorso; se Python non è installato, il comando ha un altro nome o la sua directory non è in PATH, può non esserci alcun risultato. Non aggiungere directory al PATH senza prima verificarne il contenuto e l’affidabilità.

which python3

Controllare più comandi

Ogni nome viene cercato separatamente. Con GNU which possono essere stampati i percorsi trovati e, nello stesso tempo, essere restituito uno stato non nullo perché un altro nome manca. Per interpretare un esito misto, ripeti le ricerche singolarmente; non equiparare qualsiasi output a un successo completo.

which sh awk sed

Mostrare tutte le corrispondenze in PATH

Con -a, GNU which mostra tutti i candidati eseguibili nell’ordine di PATH. Potresti ottenere un solo risultato, più percorsi o nessuno. Percorsi diversi possono riferirsi allo stesso programma tramite collegamenti: il numero di righe non equivale necessariamente al numero di installazioni indipendenti.

which -a python3

Perché il percorso non descrive tutta la risoluzione della shell

L’esempio seguente cerca ls. Un possibile risultato è quello riportato sotto, ma non esiste un percorso universale valido per ogni distribuzione, contenitore o ambiente virtuale.

which ls

Possibile output:

/usr/bin/ls

Un alias come ls --color=auto aggiunge opzioni anche quando il file esterno è quello indicato da which; una funzione può invece sostituirlo. Controlla type ls o command -V ls nella stessa shell che userai per il lavoro: lanciare una nuova shell può perdere alias e funzioni della sessione. Queste interrogazioni non eseguono ls.

Opzioni principali di GNU which

Opzione Scopo
-a, --all Mostra tutti i candidati eseguibili trovati in PATH, anziché soltanto il primo.
--skip-alias Disattiva --read-alias: non legge dall’ingresso standard gli alias forniti da un wrapper. Non cancella gli alias della shell.
--skip-functions Disattiva --read-functions: ignora le definizioni di funzione fornite sull’ingresso standard. Non rimuove le funzioni della shell.
--version Mostra la versione del programma; non tutte le implementazioni accettano questa opzione.

Esempi pratici

Osservare l’effetto dell’ordine di PATH

Questa prova crea una directory nuova con due piccoli eseguibili dimostrativi, senza avviarli. Se which-demo esiste già, mkdir interrompe il blocco: scegli un altro nome, senza sovrascrivere file. Il primo comando which stampa i percorsi a/demo-tool e b/demo-tool; dopo aver invertito le prime due directory, la ricerca semplice seleziona b/demo-tool. I prefissi saranno quelli della tua directory corrente. Il sottoprocesso tra parentesi ripristina directory di lavoro e PATH al termine; i file dimostrativi restano in which-demo.

(
  mkdir which-demo || exit 1
  cd which-demo || exit 1
  mkdir a b || exit 1
  printf '#!/bin/sh\nexit 0\n' > a/demo-tool || exit 1
  printf '#!/bin/sh\nexit 0\n' > b/demo-tool || exit 1
  chmod +x a/demo-tool b/demo-tool || exit 1
  PATH="$PWD/a:$PWD/b:$PATH"
  export PATH
  which -a demo-tool
  PATH="$PWD/b:$PWD/a:$PATH"
  which demo-tool
)

Chiedere alla shell come interpreta un nome

In Bash, type -a mostra le definizioni e i candidati disponibili, inclusi alias, funzioni e comandi interni; l’opzione -a non è una garanzia di portabilità a ogni shell. command -V offre una descrizione leggibile, mentre command -v riporta il nome o percorso con cui il comando viene risolto. Quest’ultimo può restituire anche un alias o una funzione, non soltanto un file eseguibile. Il formato dettagliato di -V non è adatto a un parser portabile. Negli script Bash l’espansione degli alias è normalmente disattivata: non dare per scontata la configurazione della sessione interattiva.

type -a ls
command -V ls
command -v ls

Verificare la disponibilità in uno script

In una shell POSIX, il controllo seguente usa lo stato di uscita di command -v senza analizzarne il testo. Stampa un messaggio per entrambi gli esiti e non avvia curl. Il successo indica che il nome è risolvibile nella shell corrente: non prova la versione, le opzioni disponibili, l’accesso alla rete o l’assenza di una funzione omonima. Se serve un comportamento preciso, controlla separatamente i requisiti di curl.

if command -v curl >/dev/null 2>&1; then
  printf '%s\n' 'curl disponibile'
else
  printf '%s\n' 'curl non trovato nella shell corrente'
fi

which e i comandi correlati

Comando Ruolo principale Quando usarlo
which Ricerca di eseguibili esterni in PATH Individuare rapidamente un percorso
command -v Interrogazione della risoluzione nella shell corrente Controllare la disponibilità di un nome negli script POSIX
type Distinzione fra alias, funzioni, comandi interni e file Diagnosticare il comportamento della shell; alcune opzioni dipendono dalla shell
whereis Ricerca di file relativi ai programmi in posizioni note Trovare binari, sorgenti e manuali, anche nelle directory considerate da PATH e MANPATH

Avvertenze importanti

Alias e funzioni potrebbero non essere rilevati

Un GNU which esterno riceve l’ambiente, ma non legge da solo gli alias e le funzioni della shell che lo avvia. Un wrapper può passarli con --read-alias o --read-functions e produrre anche definizioni, anziché semplici percorsi. Per questo è utile partire da type which. In Bash, se sospetti una posizione memorizzata non più valida, hash -t nome mostra l’eventuale voce; hash -r svuota la cache dei percorsi della sola shell e forza successive ricerche, senza modificare file o installazioni.

Le implementazioni differiscono

Controlla le opzioni prima di inserirle in uno script. In GNU which lo stato di uscita riflette quanti argomenti non sono stati trovati: non limitarti a controllare la prima riga stampata. In altre implementazioni regole e messaggi possono cambiare. Non eseguire alla cieca un percorso ottenuto analizzando output che può contenere spazi o definizioni di alias.

Un percorso non è un verdetto di sicurezza

Un percorso trovato non certifica proprietario, integrità, provenienza o possibilità di avviare davvero il programma: può mancare l’interprete di uno script o una dipendenza. In Bash, directory come . o una componente vuota di PATH possono includere la directory corrente e cambiare il candidato scelto. Confronta l’ambiente effettivo di terminale, servizio, contenitore o ambiente virtuale; non allargare PATH o privilegi solo per far sparire un errore di ricerca.

FAQ

Nessun output significa che il comando non è installato?

No. Può mancare una corrispondenza eseguibile in PATH, anche se il programma esiste altrove; il nome può inoltre essere un alias, una funzione o un comando interno. Controlla gli errori, type nome e command -v nome nella shell interessata.

Come posso mostrare ogni percorso corrispondente?

Usa which -a nome se il programma lo supporta. Per una diagnosi in Bash, type -a nome include anche le definizioni della shell. Nessuno dei due è una ricerca di tutti i file presenti sul disco.

Gli script dovrebbero usare which?

Puoi usarlo se ne controlli implementazione e output, ma per la disponibilità di un nome in uno script POSIX usa lo stato di command -v. Ricorda che un risultato positivo può indicare una funzione o un alias e non certifica le caratteristiche del programma richiesto.

In cosa si differenzia whereis?

which cerca candidati eseguibili in PATH. Il comando whereis di util-linux cerca binari, sorgenti e pagine di manuale nelle posizioni previste e considera anche PATH e MANPATH; non descrive gli alias o le funzioni della tua shell.

Fonti e documentazione