$PATH este unul dintre manipulatoarele silențioase din fundalul computerului dumneavoastră Linux. Îți afectează în liniște experiența utilizatorului, dar nu este nimic dubios în asta. Vă vom explica ce face și cum îl puteți ajusta.
Cuprins
Ce este $PATH pe Linux și cum funcționează?
Când tastați o comandă într-o fereastră de terminal și apăsați Enter, începeți destul de multă activitate înainte ca comanda să fie chiar executată.
Bash este shell-ul implicit pe majoritatea distribuțiilor Linux. Acesta interpretează linia de text pe care ați introdus-o și identifică numele comenzilor amestecate cu parametrii, conductele, redirecționări, și orice altceva este acolo. Apoi localizează fișierele binare executabile pentru acele comenzi și le lansează cu parametrii pe care i-ați furnizat.
Primul pas pe care îl face shell-ul pentru a localiza executabilul este să identifice dacă este chiar implicat un binar. Dacă comanda pe care o utilizați se află în shell-ul propriu-zis (a „shell încorporat”) nu este necesară nicio căutare suplimentară.
Incorporațiile Shell sunt cele mai ușor de găsit, deoarece sunt parte integrantă a shell-ului. Este ca și cum le-ai avea într-o centură de scule – sunt mereu cu tine.
Dacă ai nevoie de unul dintre celelalte instrumente ale tale, totuși, trebuie să scotoci în atelier pentru a-l găsi. Este pe banca ta de lucru sau pe un cuier de perete? Asta face variabila de mediu $PATH. Conține o listă de locuri în care shell-ul caută și ordinea în care vor fi căutate.
Dacă doriți să vedeți dacă o comandă este a shell încorporat, un alias, o funcție sau un binar autonom mv /work/unfile, puteți folosi comanda tip așa cum se arată mai jos:
type clear
type cd
Acest lucru ne spune că clear este un fișier binar, iar primul găsit în cale se află la /usr/bin. Este posibil să aveți mai multe versiuni de clear instalate pe computer, dar aceasta este cea pe care shell-ul va încerca să o folosească.
Deloc surprinzător, cd este un shell încorporat.
Listarea dvs. $PATH
Este ușor să vezi ce este în calea ta. Doar tastați următoarele pentru a utiliza comanda echo și imprimați valoarea păstrat în variabila $PATH:
echo $PATH
Rezultatul este o listă de locații ale sistemului de fișiere delimitate cu două puncte (:). Shell-ul caută de la stânga la dreapta prin cale, verificând fiecare locație a sistemului de fișiere pentru un executabil potrivit pentru a vă executa comanda.
Ne putem alege în listă pentru a vedea locațiile sistemului de fișiere care vor fi căutate și ordinea în care vor fi căutate:
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/cos
/usr/jocuri
/usr/local/games
/snap/bin
Ceva care ar putea să nu fie imediat evident este că căutarea nu începe în directorul de lucru curent. Mai degrabă, își face drum prin directoarele listate și numai prin directoarele listate.
Dacă directorul de lucru curent nu se află în calea dvs., acesta nu va fi căutat. De asemenea, dacă aveți comenzi stocate în directoare care nu sunt în cale, shell-ul nu le va găsi.
Pentru a demonstra acest lucru, am creat un mic program numit rf. Când este executat, rf afișează numele directorului din care a fost lansat în fereastra terminalului. Este situat în /usr/local/bin. Avem și o versiune mai nouă în directorul /dave/work.
Introducem următoarea ce comandă pentru a ne arăta ce versiune a programului nostru shell-ul va găsi și va folosi:
which rf
Shell-ul raportează că versiunea găsită este cea din directorul care se află în cale.
Introducem următoarele pentru a-l porni:
rf
Versiunea 1.0 a rf rulează și confirmă că așteptările noastre au fost corecte. Versiunea găsită și executată se află în /usr/local/bin.
Pentru a rula orice altă versiune de rf pe acest computer, va trebui să folosim calea către executabil pe linia de comandă, așa cum se arată mai jos:
./work/rf
Acum că am spus shell-ului unde să găsim versiunea de rf pe care vrem să o rulăm, folosește versiunea 1.1. Dacă preferăm această versiune, o putem copia în directorul /usr/local/bin și o putem suprascrie pe cea veche.
Să presupunem că dezvoltăm o nouă versiune de rf. Va trebui să-l rulăm frecvent pe măsură ce îl dezvoltăm și îl testăm, dar nu dorim să copiem o versiune de dezvoltare nelansată în mediul live.
Sau, poate că am descărcat o nouă versiune de rf și vrem să facem niște teste de verificare înainte de a o face disponibilă publicului.
Dacă adăugăm directorul nostru de lucru la cale, facem ca shell-ul să găsească versiunea noastră. Și această schimbare ne va afecta doar pe noi — alții vor folosi în continuare versiunea rf în /usr/local/bin .
Adăugarea unui director la $PATH
Puteți folosi comanda de export pentru adăugați un director spre $PATH. Directorul este apoi inclus în lista de locații ale sistemului de fișiere pe care le caută shell. Când shell-ul găsește un executabil care se potrivește, oprește căutarea, așa că doriți să vă asigurați că caută mai întâi în directorul dvs., înainte de /usr/local/bin.
Acest lucru este ușor de făcut. Pentru exemplul nostru, introducem următoarele pentru a adăuga directorul nostru la începutul căii, astfel încât să fie prima locație căutată:
export PATH=/home/dave/work:$PATH
Această comandă setează $PATH să fie egal cu directorul pe care îl adăugăm, /home/dave/work și apoi întreaga cale curentă.
Prima PATH nu are semnul dolarului ($). Setăm valoarea pentru PATH. Ultimul $PATH are un semn dolar, deoarece facem referință la conținutul stocat în variabila PATH. De asemenea, rețineți două puncte (:) dintre noul director și numele variabilei $PATH.
Să vedem cum arată drumul acum:
echo $PATH
Directorul nostru /home/dave/work este adăugat la începutul căii. Colonul pe care l-am furnizat îl separă de restul căii.
Introducem următoarele pentru a verifica că versiunea noastră de rf este prima găsită:
which rf
Dovada din budincă este rf, așa cum se arată mai jos:
rf
Shell-ul găsește versiunea 1.1 și o execută din /home/dave/work.
Pentru a adăuga directorul nostru la sfârșitul căii, îl mutăm la sfârșitul comenzii, așa:
export PATH=$PATH:/home/dave/work
Asigurarea permanentă a schimbărilor
La fel de Beth Brooke-Marciniak a spus: „Succesul este bine, dar succesul este trecător”. În momentul în care închideți fereastra terminalului, toate modificările pe care le-ați făcut la $PATH dispar. Pentru a le face permanente, trebuie să puneți comanda de export într-un fișier de configurare.
Când puneți comanda de export în fișierul dvs. .bashrc, aceasta setează calea de fiecare dată când deschideți o fereastră de terminal. Spre deosebire de sesiuni SSH, pentru care trebuie să vă autentificați, acestea se numesc sesiuni „interactive”.
În trecut, puneai comanda de export în fișierul tău .profile pentru a seta calea pentru sesiunile de conectare la terminal.
Cu toate acestea, am constatat că, dacă punem comanda de export fie în fișierele .bashrc, fie în fișierele .profile, aceasta setează corect calea atât pentru sesiunile interactive, cât și pentru sesiunile de conectare la terminal. Experiența ta poate fi diferită. Pentru a face față tuturor eventualităților, vă vom arăta cum să faceți acest lucru în ambele fișiere.
Utilizați următoarea comandă în directorul dvs. /home pentru a edita fișierul .bashrc:
gedit .bashrc
Editorul gedit se deschide cu fișierul .bashrc încărcat.
Derulați până în partea de jos a fișierului, apoi adăugați următoarea comandă de export pe care am folosit-o mai devreme:
export PATH=/home/dave/work:$PATH
Salvați fișierul. Apoi, fie închideți și redeschideți fereastra terminalului, fie utilizați comanda dot pentru a citi fișierul .bashrc, după cum urmează:
. .bashrc
Apoi, tastați următoarea comandă echo pentru a verifica calea:
echo $PATH
Aceasta adaugă directorul /home/dave/work la începutul căii.
Procesul de adăugare a comenzii la fișierul .profile este același. Tastați următoarea comandă:
gedit .profile
Editorul gedit se lansează cu fișierul .profile încărcat.
Adăugați comanda de export în partea de jos a fișierului, apoi salvați-o. Închiderea și deschiderea unei noi ferestre de terminal este insuficientă pentru a forța recitirea fișierului .profile. Pentru ca noile setări să aibă efect, trebuie să vă deconectați și să vă reconectați sau să utilizați comanda dot așa cum se arată mai jos:
. .profile
Stabilește calea pentru toată lumea
Pentru a seta calea pentru toți cei care folosesc sistemul, puteți edita fișierul /etc/profile.
Va trebui să utilizați sudo, după cum urmează:
sudo gedit /etc/profile
Când se lansează editorul gedit, adăugați comanda de export în partea de jos a fișierului.
Salvați și închideți fișierul. Modificările vor intra în vigoare pentru alții data viitoare când se conectează.
O notă despre securitate
Asigurați-vă că nu adăugați accidental două două puncte „:” la cale, așa cum se arată mai jos.
Dacă faceți acest lucru, aceasta va căuta mai întâi în directorul curent, ceea ce introduce un risc de securitate. Să presupunem că ați descărcat un fișier arhivă și l-ați dezarhivat într-un director. Te uiți la fișiere și vezi un alt fișier arhivat. Mai apelați la unzip pentru a extrage acea arhivă.
Dacă prima arhivă conținea un fișier executabil numit unzip care era un executabil rău intenționat, l-ai declanșa accidental pe acela în loc de executabilul real de dezarhivare. Acest lucru s-ar întâmpla deoarece shell-ul ar căuta mai întâi în directorul curent.
Prin urmare, aveți grijă întotdeauna când introduceți comenzile de export. Folosiți echo $PATH pentru a le revizui și pentru a vă asigura că sunt așa cum doriți să fie.