Cum să utilizați comanda care pe Linux

O comandă Linux esențială, „which”, identifică fișierul executabil care este lansat atunci când introduceți o comandă în linia de comandă. Această utilitate devine deosebit de relevantă când aveți mai multe versiuni ale aceluiași program instalate pe sistem, permițându-vă să determinați care dintre ele va fi utilizată de shell.

Executabile și Căi

Când inițiați executarea unui program sau a unei comenzi din terminal, shell-ul (de regulă, Bash în distribuțiile moderne) trebuie să localizeze comanda și să o execute. Unele comenzi, precum cd, history, și pwd, sunt integrate direct în shell, eliminând necesitatea ca Bash să le caute suplimentar.

Însă, cum identifică Bash comenzile, programele și fișierele executabile externe? Bash utilizează conceptul de „cale” (path), care este o listă ordonată de directoare. Shell-ul verifică fiecare director din această listă, în căutarea unui fișier executabil care corespunde comenzii pe care încercați să o rulați. Odată ce găsește o potrivire, Bash o execută și oprește căutarea.

Puteți inspecta variabila de mediu $PATH folosind comanda echo, pentru a vedea directoarele incluse în calea sistemului dvs. Tastați următoarea comandă și apăsați Enter:

echo $PATH

Rezultatul afișează o listă de căi, separate prin două puncte (:). De exemplu, pe un sistem tipic, Bash va căuta executabile în următoarea ordine:

/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/cos
/utilizator/jocuri
/usr/local/games
/snap/bin

Prezența mai multor foldere numite /sbin și /bin poate genera confuzie în sistemul de fișiere.

Analiza Căilor

Să presupunem că avem o versiune actualizată a unui program numit „htg”, localizată în directorul curent. O putem executa introducând:

./htg

Acest program afișează numărul versiunii și se închide. În cazul nostru, noua versiune este 1.2.138.

Pentru a executa un program din directorul curent, trebuie să adăugați prefixul „./” înaintea numelui programului. Acest lucru ajută Bash să localizeze executabilul.

Pentru a face programul accesibil din orice director, îl vom muta în /usr/bin. Acum, Bash va putea găsi programul în cale și îl va executa fără probleme.

Nu mai avem nevoie de executabil în directorul curent, și nu mai este necesar să introducem „./” înainte de numele programului. Introducem:

sudo mv htg /usr/bin

Acum, încercăm să lansăm programul introducând:

htg

Se pare că se execută ceva, dar nu este versiunea noastră actualizată. În schimb, este o versiune mai veche, 1.2.105.

Rolul comenzii `which`

Problema descrisă anterior este exact motivul pentru care a fost creată comanda which.

Vom folosi comanda which, transmițând numele programului pe care îl analizăm ca argument:

which htg

Comanda which ne informează că a găsit o versiune a lui „htg” în directorul /usr/local/bin. Deoarece acest director apare în cale înaintea celui în care am mutat versiunea actualizată, Bash execută versiunea veche a programului.

Însă, folosind opțiunea -a (toate), comanda which continuă căutarea chiar și după ce găsește o potrivire:

which -a htg

Aceasta afișează toate potrivirile din toate directoarele din cale.

Astfel, avem o versiune mai veche a programului într-un director care se află de asemenea în calea sistemului. Acest director este accesat înaintea celui în care am mutat versiunea mai nouă.

Pentru a confirma acest lucru, putem rula în mod explicit ambele versiuni ale programului:

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

Aceasta clarifică problema, iar rezolvarea este simplă. Avem mai multe opțiuni: putem șterge versiunea veche din /use/local/bin, sau putem muta versiunea din /usr/bin în /usr/local/bin.

Interpretarea Rezultatelor

Nu întotdeauna două rezultate înseamnă prezența a două fișiere executabile diferite.

Să luăm un exemplu: folosim comanda which cu opțiunea -a pentru a căuta versiuni ale programului „less”:

which -a less

Comanda which raportează două locații care găzduiesc o versiune a lui „less”. Însă, este posibil să existe două versiuni diferite sau aceeași versiune în mai multe locuri, instalate pe un sistem Linux? Pentru a analiza mai în detaliu, vom folosi comanda „ls” cu opțiunile -l (listă lungă) și -h (format lizibil):

ls -lh /usr/bin/less

Dimensiunea fișierului este de doar nouă octeți! Asta cu siguranță nu este o copie completă a programului „less”.

Primul caracter din listă este „l”. Un fișier normal ar avea un caracter „-” ca prim caracter. „l” indică faptul că este o legătură simbolică. Simbolul „->” confirmă faptul că este vorba de o legătură simbolică, un fel de scurtătură. Aceasta indică spre copia lui „less” din directorul /bin.

Să verificăm acum și versiunea din /bin:

ls -lh /bin/less

Această intrare este un executabil binar „real”. Primul caracter al listei este „-„, indicând un fișier obișnuit, iar dimensiunea fișierului este de 167 KB. Așadar, există o singură copie a lui „less” instalată, dar există o legătură simbolică spre ea dintr-un alt director, pe care Bash o găsește în timpul căutării în cale.

Verificarea Mai Multor Comenzi

Puteți introduce mai multe programe sau comenzi ca argumente pentru which, pentru a le verifica în ordine:

De exemplu, tastați:

which ping cat uptime date head

Comanda which va parcurge lista de comenzi furnizate și va afișa rezultatele pentru fiecare.

Analizând Comanda `which`

Interesant, putem folosi și comanda which pentru a-și verifica propria locație:

which which

Pe lângă explorarea sistemului de fișiere Linux, comanda which este extrem de utilă atunci când vă așteptați la un anumit comportament din partea unei comenzi, dar obțineți altul. În astfel de cazuri, which vă ajută să determinați exact ce comandă este lansată de Bash.