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);