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.




