Cum să adăugați un director la $PATH în Linux

Variabila de mediu $PATH reprezintă un aspect fundamental al sistemelor Linux, operând în mod discret în fundal. Deși influențează semnificativ experiența utilizatorului, rolul său este esențial și inofensiv. Acest articol va explica funcționalitatea acestei variabile și modul în care o puteți personaliza.

Ce reprezintă $PATH în Linux și cum funcționează?

Când introduceți o comandă în terminal și apăsați Enter, are loc un proces complex înainte ca acea comandă să fie executată efectiv.

Bash, shell-ul implicit pe majoritatea distribuțiilor Linux, preia linia de text introdusă, identificând numele comenzilor, parametrii, conductele, redirecționările și alte elemente. Ulterior, localizează fișierele binare executabile corespunzătoare comenzilor și le lansează cu parametrii specificați.

Primul pas în localizarea executabilului constă în determinarea dacă comanda respectivă este asociată unui binar. Dacă comanda este încorporată în shell (un „shell builtin”), nu este necesară nicio căutare suplimentară. Comenzile încorporate sunt ușor accesibile, fiind componente ale shell-ului în sine.

În cazul comenzilor externe, variabila de mediu $PATH joacă un rol crucial. Aceasta conține o listă ordonată de directoare în care shell-ul va căuta fișierele executabile, respectând o anumită secvență.

Pentru a verifica natura unei comenzi (dacă este un shell încorporat, un alias, o funcție sau un binar autonom, de exemplu mv /work/unfile), puteți utiliza comanda type, așa cum este prezentat mai jos:

type clear
type cd

Acest rezultat indică faptul că clear este un fișier binar, localizat la /usr/bin, fiind prima versiune găsită de shell. Pot exista multiple versiuni ale comenzii clear instalate, dar aceasta va fi cea utilizată în mod implicit. Pe de altă parte, cd este identificat ca o comandă shell încorporată.

Vizualizarea conținutului variabilei $PATH

Pentru a vedea conținutul variabilei $PATH, utilizați comanda echo, așa cum este exemplificat mai jos:

echo $PATH

Rezultatul afișează o listă de directoare din sistemul de fișiere, separate prin două puncte (:). Shell-ul va căuta fișierele executabile de la stânga la dreapta, parcurgând fiecare director în ordine până când găsește o potrivire.

Exemplul următor ilustrează o listă tipică de directoare căutate de shell:

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

Un aspect important de reținut este că, în mod implicit, căutarea nu începe din directorul curent de lucru, ci doar din directoarele listate în variabila $PATH. Dacă un director care conține comenzi nu este inclus în $PATH, shell-ul nu va putea localiza acele comenzi.

Pentru a ilustra acest comportament, vom folosi un program numit rf, care afișează directorul din care a fost lansat. Acesta se află în directorul /usr/local/bin, dar avem și o versiune mai nouă în /dave/work.

Pentru a identifica versiunea programului rf pe care o va găsi și utiliza shell-ul, introducem următoarea comandă:

which rf

Shell-ul confirmă că va utiliza versiunea din directorul /usr/local/bin, conform căii $PATH.

Când lansăm programul rf:

rf

Observăm că se execută versiunea 1.0 din /usr/local/bin. Pentru a rula versiunea din altă locație, trebuie să specificăm calea completă, așa cum se arată mai jos:

./work/rf

Astfel, rulăm versiunea 1.1, indicând shell-ului calea exactă. Dacă preferăm această versiune, o putem înlocui pe cea veche din /usr/local/bin.

În situația în care dezvoltăm o nouă versiune a programului rf, este necesar să o testăm frecvent fără a o lansa în mediul de producție. În mod similar, dacă descărcăm o versiune nouă, dorim să o verificăm înainte de a o pune la dispoziția publicului.

Adăugarea directorului de lucru la variabila $PATH permite shell-ului să găsească noua versiune, iar această modificare ne afectează doar pe noi, ceilalți utilizatori continuând să folosească versiunea existentă în /usr/local/bin.

Adăugarea unui director la variabila $PATH

Pentru a adăuga un director la $PATH, utilizăm comanda export. Directorul adăugat va fi inclus în lista de locații căutate de shell. Deoarece shell-ul se oprește după ce găsește prima potrivire, este important să vă asigurați că directorul dvs. este căutat înaintea celorlalte, de exemplu, înaintea /usr/local/bin.

Pentru a adăuga directorul /home/dave/work la începutul variabilei $PATH, introducem următoarea comandă:

export PATH=/home/dave/work:$PATH

Această comandă stabilește valoarea variabilei $PATH ca fiind egală cu noul director, urmată de valoarea actuală a variabilei $PATH. Prima apariție a lui PATH nu are simbolul dolar ($), deoarece îi setăm valoarea, în timp ce a doua are simbolul dolar ($), indicând conținutul variabilei. Separăm noul director de restul variabilei $PATH prin două puncte (:).

Pentru a verifica noua valoare a variabilei $PATH, executăm:

echo $PATH

Directorul /home/dave/work a fost adăugat la începutul variabilei $PATH, fiind separat de restul listei prin două puncte (:).

Acum, pentru a verifica dacă noua noastră versiune de rf este găsită prima, executăm:

which rf

După cum se confirmă prin execuția comenzii rf:

rf

Shell-ul găsește și execută versiunea 1.1 din /home/dave/work.

Pentru a adăuga directorul la sfârșitul variabilei $PATH, îl mutăm la sfârșitul comenzii:

export PATH=$PATH:/home/dave/work

Păstrarea permanentă a modificărilor

Așa cum a afirmat Beth Brooke-Marciniak, „Succesul este bun, dar este trecător”. Modificările aduse variabilei $PATH se pierd la închiderea ferestrei terminalului. Pentru a le face permanente, trebuie să adăugați comanda export într-un fișier de configurare.

Plasarea comenzii export în fișierul .bashrc va seta variabila $PATH de fiecare dată când deschideți o nouă fereastră terminal. Aceste sesiuni sunt denumite sesiuni interactive, spre deosebire de sesiunile SSH, unde este necesară autentificarea.

În trecut, pentru sesiunile de conectare la terminal, comanda export era adăugată în fișierul .profile. Totuși, în practică, am observat că includerea comenzii în ambele fișiere (.bashrc și .profile) asigură setarea corectă a variabilei $PATH atât pentru sesiunile interactive, cât și pentru cele de conectare. Pentru a acoperi toate posibilitățile, vom exemplifica cum se face acest lucru în ambele fișiere.

Utilizați următoarea comandă în directorul /home pentru a edita fișierul .bashrc:

gedit .bashrc

Editorul gedit se va deschide, încărcând fișierul .bashrc.

Derulați la finalul fișierului și adăugați următoarea comandă export:

export PATH=/home/dave/work:$PATH

Salvați fișierul. Apoi, închideți și redeschideți fereastra terminalului sau utilizați comanda . pentru a reîncărca fișierul .bashrc:

. .bashrc

Ulterior, executați comanda echo pentru a verifica valoarea variabilei $PATH:

echo $PATH

Această operațiune adaugă directorul /home/dave/work la începutul variabilei $PATH.

Procesul de adăugare a comenzii în fișierul .profile este similar. Executați comanda:

gedit .profile

Editorul gedit va deschide fișierul .profile.

Adăugați comanda export la sfârșitul fișierului și salvați modificările. Închiderea și redeschiderea ferestrei terminalului nu este suficientă pentru ca fișierul .profile să fie reîncărcat. Pentru ca noile setări să fie aplicate, trebuie să vă deconectați și să vă reconectați sau să utilizați comanda ., așa cum se arată mai jos:

. .profile

Setarea variabilei $PATH pentru toți utilizatorii

Pentru a seta variabila $PATH pentru toți utilizatorii sistemului, puteți edita fișierul /etc/profile. Este necesar să utilizați sudo, așa cum se arată mai jos:

sudo gedit /etc/profile

După lansarea editorului gedit, adăugați comanda export la sfârșitul fișierului.

Salvați și închideți fișierul. Modificările vor fi aplicate celorlalți utilizatori la următoarea lor conectare.

O observație despre securitate

Evitați adăugarea accidentală a două puncte (:) consecutive la variabila $PATH, așa cum se vede mai jos:

Această eroare ar face ca shell-ul să caute în directorul curent, ceea ce prezintă un risc de securitate. De exemplu, dacă ați descărcat un fișier arhivă și l-ați dezarhivat într-un director, unde este prezent un alt fișier arhivă. Dacă utilizați comanda unzip pentru a extrage a doua arhivă.

În cazul în care prima arhivă conține un executabil cu numele unzip, dar care este de fapt un fișier malițios, acesta ar fi executat în loc de programul real unzip, deoarece shell-ul va căuta mai întâi în directorul curent.

De aceea, trebuie să fiți precauți când introduceți comenzile export. Utilizați echo $PATH pentru a verifica și asigura că variabila $PATH este corect configurată.