Come usare il comando which in Linux

Contenuti

Una finestra di terminale in esecuzione su un laptop Linux.

El Linux which comando identifica il binario eseguibile che viene avviato quando un comando viene inviato alla shell. Se hai diverse versioni dello stesso programma sul tuo computer, Puoi usare which per scoprire quale utilizzerà la shell.

Binari e percorsi

Quando si tenta di eseguire un programma o un comando dalla finestra del terminale, el shell (in genere, Provato nelle distribuzioni moderne) devi trovare quel comando ed eseguirlo. Alcuni comandi, Che cosa cd, storia, e pwd, sono incorporati nel guscio, così Bash non deve sforzarsi troppo per trovarli.

Ma, In che modo Bash individua altri comandi?, binari e programmi esterni indipendenti? Bene, Bash usa il percorso, che in realtà è una raccolta di percorsi, ognuno dei quali punta a una directory. Quindi cerca in ciascuna di queste directory un eseguibile che corrisponda al comando o al programma che sta tentando di eseguire.. Quando ne trovi uno, Bash lo lancia e abbandona la ricerca.

Puoi usare echo per controllare il $PATH variabile d'ambiente e vedere le directory nel tuo percorso. Per farlo, digita quanto segue e poi premi Invio:

echo $PATH

L'elenco di output separa ogni percorso con i due punti (:). Sul computer che stiamo usando, Bash cercherà le seguenti directory in questo ordine:

  • /usr/local/sbin
  • /usr/local/bin
  • /usr/sbin
  • /usr/bin
  • /sbin
  • /bin
  • /user/games
  • /usr/local/games
  • /snap/bin

Ci sono molte cartelle chiamate /sbin e /bin nel file system, che può causare un po' di confusione.

Guarda quelle strade

Diciamo che abbiamo una versione aggiornata di un programma chiamato htg. È nella nostra directory corrente e possiamo eseguirlo digitando il seguente comando:

./htg

Non è un grande spettacolo, stampa solo il numero di versione e poi si chiude. La nuova versione è 1.2.138.

Per eseguire un programma nella directory di lavoro corrente, deve scrivere “./” delante del nombre del programa, così Bash sa dove trovarlo.

Perché vogliamo eseguire questo particolare programma da qualsiasi directory, spostiamo l'eseguibile in /usr/bin directory. Bash troverà quel programma sul percorso e lo eseguirà per noi.

Non abbiamo bisogno dell'eseguibile nella nostra directory corrente, ni necesitamos escribir “./” delante del nombre del programa, come mostrato di seguito:

sudo mv htg /usr/bin

Ora, Proviamo a eseguire il programma digitando:

htg

Qualcosa corre, ma non è il nostro programma nuovo e aggiornato. Piuttosto, è la versione precedente, 1.2.105.

Colui che comanda

Il problema che abbiamo dimostrato in precedenza è perché which comando è stato progettato.

In questo esempio, noi useremo which e passa il nome del programma che stiamo studiando come parametro della riga di comando:

quale htg

which segnala di aver trovato una versione di htg a /usr/local/bin directory. Perché quella posizione appare nel percorso prima della directory in cui abbiamo spostato l'aggiornamento htg, Bash usa quella versione precedente del programma.

Nonostante questo, se usiamo il -a (Tutto quanto) opzione come mostrato di seguito, which continua la ricerca anche se trova una corrispondenza:

che -a htg

Quindi elenca tutte le corrispondenze in una qualsiasi delle directory nel percorso.

Quindi, questo è il problema: c'è una versione precedente del programma in una directory che è anche nella patch. E quella directory viene cercata prima della directory in cui rilasciamo la nuova versione del programma.

Verificare, possiamo scrivere quanto segue ed eseguire esplicitamente ogni versione del programma:

/usr/local/bin/htg
/usr/bin/htg

Questo spiega il problema e la risposta è semplice.

In realtà, abbiamo opzioni. Possiamo rimuovere la versione precedente nel /use/local/bin directory o spostarlo da /usr/bin per /usr/local/bin.

Guarda quei risultati

Due risultati non significano necessariamente due file binari.

Diamo un'occhiata a un esempio in cui useremo il which comando con il -a (tutti) e cerca le versioni del less Programma:

che -a meno

which segnala due sedi che ospitano una versione del less Programma, ma è vero?? Sarebbe strano avere due versioni diverse (o la stessa versione in più sedi) a partire dal less installato su un computer Linux. Quindi, non accetteremo la partenza di which. Anziché, scaviamo un po' più a fondo.

Possiamo usare il ls, -l (lunga lista), e -h opzioni (leggibile dagli umani) per vedere cosa sta succedendo:

ls -lh /usr/bin/less

La dimensione del file è riportata come nove byte!! Sicuramente non una copia completa di less.

Il primo carattere dell'elenco è un “io”. Un file normale avrebbe un trattino (-) come primo personaggio. Il “io” es un símbolo que significa collegamento simbolico. Se ti sei perso quel dettaglio, il --> Il simbolo indica anche che si tratta di un collegamento simbolico, che puoi considerare come una sorta di scorciatoia. Questo punta alla copia di less Su /bin.

Riproviamo con la versione di less Su /bin:

ls -lh /bin/meno

Esta entrada es por lo visto un ejecutable binario “vero”. Il primo carattere nell'elenco è un trattino (-), il che significa che è un file normale e la dimensione del file è 167 KB. Quindi, solo una copia di less è installato, ma c'è un collegamento simbolico da un'altra directory, che Bash trova anche durante la ricerca del percorso.

IMPARENTATO: Come usare il comando ls per elencare file e directory in Linux

Controllo di più comandi contemporaneamente

Puoi passare vari programmi e comandi a which, e li esaminerò in ordine.

Come esempio, se scrivi:

quale testa della data di uptime del gatto ping

which scorre l'elenco dei programmi e dei comandi forniti ed elenca il risultato di ciascuno.

Quale è quale??

Se desideri, puoi anche usare which su se stesso scrivendo quanto segue:

quale

Mentre frugavo nel file system di Linux per curiosità, which è molto utile quando ci si aspetta un insieme di comportamenti da un comando o da un programma, ma prendine un altro.

Puoi usare which in questi casi, per verificare che il comando che stai lanciando Bash sia quello che vuoi usare.

impostaTimeout(funzione(){
!funzione(F,B,e,v,n,T,S)
{Se(f.fbq)Restituzione;n=f.fbq=funzione(){n.callMethod?
n.callMethod.apply(n,argomenti):n.queue.push(argomenti)};
Se(!f._fbq)f._fbq = n;n.push=n;n.loaded=!0;n.version='2.0′;
n.coda=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(T,S) } (window, documento,'copione',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('dentro', '335401813750447');
fbq('traccia', 'Visualizzazione della pagina');
},3000);

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.