Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Windows 10
  • PATH varijabla okruženja. PATH varijabla okruženja Varijabla putanje u linuxu

PATH varijabla okruženja. PATH varijabla okruženja Varijabla putanje u linuxu

Kada unesete komandu na komandnoj liniji, vi u osnovi govorite ljusci da pokrene izvršni fajl sa datim imenom. Na Linuxu, ovi izvršni programi kao što su ls, find, file i drugi obično žive u nekoliko različitih direktorija na vašem sistemu. Bilo koja datoteka s izvršnim dozvolama pohranjena u ovim direktorijima može se pokrenuti s bilo kojeg mjesta. Najčešći direktoriji koji sadrže izvršne programe su /bin, /sbin, /usr/sbin, /usr/local/bin i /usr/local/sbin.

Ali kako ljuska zna u kojim direktorijumima da traži izvršne programe ili ljuska pretražuje cijeli sistem datoteka?

Odgovor je jednostavan. Kada izdate naredbu, ljuska pretražuje sve direktorije navedene u korisničkoj varijabli $PATH u potrazi za izvršnom datotekom s tim imenom.

Ovaj članak vam pokazuje kako da dodate direktorije vašoj sistemskoj varijabli $PATH.

Šta je $PATH u Linuxu

Varijabla okruženja $PATH je lista direktorija kolonizirana dvotočkom koja govori ljusci koje direktorije da traži izvršne datoteke.

Da biste provjerili koje direktorije imate u svojoj varijabli $PATH, možete koristiti printenv ili echo naredbu:

Echo $PATH

Izlaz će izgledati otprilike ovako:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Ako imate dvije izvršne datoteke s istim imenom koje se nalaze u dva različita direktorija, ljuska će pokrenuti datoteku koja se nalazi u direktoriju koji je prvi u $PATH.

Dodavanje direktorija na vaš $PATH

Postoje situacije u kojima ćete možda htjeti dodati druge direktorije vašoj varijabli $PATH. Na primjer, neki programi mogu biti instalirani na različitim lokacijama ili ćete možda htjeti imati namjenski direktorij za svoje lične unose, ali možete ih pokrenuti bez navođenja apsolutne putanje do izvršnih datoteka. Da biste to učinili, trebate samo dodati direktorij u svoj $PATH.

Recimo da imate direktorij koji se zove bin koji se nalazi u vašem početnom direktoriju u koji pohranjujete svoje shell skripte. Da dodate direktorij vašoj varijabli $PATH:

Naredba za izvoz izvozi izmijenjenu varijablu u podređena okruženja procesa ljuske.

Sada možete pokrenuti svoje skripte jednostavnim upisivanjem imena izvršne skripte bez navođenja pune putanje do izvršne datoteke.

Međutim, ova promjena je privremena i utječe samo na trenutnu sesiju ljuske.

Da bi promjena bila trajna, morate definirati varijablu $PATH u vašim konfiguracijskim datotekama ljuske. Na većini Linux distribucija, kada se pokreće nova sesija, varijable okruženja se čitaju iz sljedećih datoteka:

  • Globalne konfiguracijske datoteke ljuske kao što su /etc/environment i /etc/profile. Koristite ovu datoteku ako želite da se novi direktorij doda u $PATH svih korisnika sistema.
  • Konfiguracijski fajlovi za pojedinačne korisničke ljuske. Na primjer, ako koristite Bash, možete postaviti varijablu $PATH u ~/.bashrc datoteci, a ako koristite Zsh, ime datoteke je ~/.zshrc.

U ovom primjeru ćemo postaviti varijablu u ~/.bashrc datoteci. Otvorite datoteku u uređivaču teksta i dodajte sljedeći red na kraju:

Nano ~/.bashrc

Izvezi PATH="$HOME/bin:$PATH"

Sačuvajte datoteku i učitajte novu vrijednost $PATH u trenutnu sesiju ljuske koristeći :

Izvor ~/.bashrc

Da biste potvrdili da je direktorij uspješno dodan, ispišite njegovu vrijednost $PATH upisivanjem:

Echo $PATH

Zaključak

Dodavanje novih direktorija vašem korisničkom ili globalnom $PATH je prilično jednostavno. Ovo vam omogućava da pokrenete komande i skripte pohranjene na nestandardnim lokacijama bez potrebe da unosite punu putanju do izvršne datoteke.

Iste upute vrijede za bilo koju distribuciju Linuxa, uključujući , CentOS, RHEL, Debian i Linux Mint.

Slobodno ostavite komentar ako imate pitanja.

Šta je to? Mnoge komande koje unosite u komandnoj liniji zahtevaju upotrebu eksternog programa koji se učitava iz sistema datoteka. Na primjer, komande poput mkdir i wc se zapravo nalaze u /bin folderu.

Kada unesete instrukciju koju Bash ljuska ne prepoznaje, ona pokušava da je izvrši kao program i vraća grešku ako ne pronađe program sa tim imenom. I to se ne odnosi samo na osnovne komande koje smo pogledali, jer iz komandne linije možete pokrenuti bilo koji program.


Ali kako, ako je prisutan u sistemu datoteka, Linux zna koje programe treba pokrenuti iz kojih direktorija? OS koristi varijablu sistemskog okruženja da specificira podskup foldera za pretraživanje kada primi nepoznatu komandu. Ova varijabla se zove PATH i može se prikazati sa sljedećom eho komandom (simbol $ je obavezan):

Echo $PATH

Izlaz ove naredbe će izgledati kao sljedećih sedam apsolutnih putanja foldera, odvojenih dvotočkama:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Kad god unesete nepoznatu naredbu, Linux će pregledati svaki od foldera navedenih u varijabli okruženja redoslijedom kojim su specificirani, pokušavajući pronaći program s istim imenom. Ako se program pronađe, pokreće se; u suprotnom se prikazuje poruka o grešci. Ali neće biti greška ako kupite svoje voljeno srebrno prstenje na poklon. Srebro će ukrasiti svaku ženu!

Ovih sedam fascikli omogućavaju lak pristup svim glavnim programima u operativnom sistemu, uključujući . Bilo koji program izvan ovih sedam foldera ne može se pokrenuti jednostavnim upisivanjem njihovog imena u komandnu liniju.

Na primjer, preuzeli ste uslužni program dnevnika sa Interneta u svoju kućnu fasciklu. Ako unesete njegovo ime na komandnoj liniji, dobićete poruku o grešci jer se nalazi u fascikli koja nije uključena u sistemsku putanju. Da biste pokrenuli ovaj program, unesite sljedeći red (zapamtite, ~ simbol je skraćenica za vaš kućni folder):

Ako ste ga sačuvali u fascikli izvan vaše navedene putanje, moraćete da unesete apsolutnu putanju i ime datoteke da biste pokrenuli uslužni program.

Naravno, pretpostavlja se da je dnevnik jednostavan samostalni program koji ne zahtijeva instalaciju, jer će većina velikih aplikacija smjestiti izvršnu datoteku programa negdje na vašu specificiranu putanju tokom procesa instalacije. Volim ovo PATH varijabla okruženja, uživajte za svoje zdravlje!

Pitam se gdje treba dodati novu putanju varijablu okruženja PATH. Znam da se to može postići uređivanjem .bashrc (na primjer), ali nije jasno kako to učiniti.

ovako:

Izvezi PATH=~/opt/bin:$PATH

Izvezi PATH=$PATH:~/opt/bin

11 odgovora

Jednostavan materijal

PATH=$PATH:~/opt/bin PATH=~/opt/bin:$PATH

u zavisnosti od toga da li želite da dodate ~/opt/bin kod na kraj (da pretražite sve druge direktorijume ako postoji program sa istim imenom u više direktorijuma) ili na početak (da pretražujete pre svih ostalih direktorijuma).

Možete dodati više unosa u isto vrijeme. PATH=$PATH:~/opt/bin:~/opt/node/bin ili promjene u redoslijedu su sasvim u redu.

Ne morate da izvozite ako je promenljiva već u okruženju: svaka promena vrednosti varijable se odražava u okruženju.¹ PATH je skoro uvek u okruženju; svi unix sistemi ga instaliraju vrlo rano (u stvari, obično u prvom procesu).

Ako vaš PATH kreira mnogo različitih komponenti, možete završiti s duplim unosima. Pogledajte Kako dodati putanju u vaš početni direktorij koju će Unix otkriti, koja naredba? i Uklonite duplikate $PATH unosa koristeći naredbu awk da biste izbjegli duplikate ili ih uklonili.

Gdje staviti

Imajte na umu da ~/.bash_rc nije čitljiv ni za jedan program, a ~/.bashrc je konfiguracijska datoteka za interaktivne bash instance. Ne biste trebali definirati varijable okruženja u ~/.bashrc. Ispravno mjesto za definiranje varijabli okruženja kao što je PATH je ~/.profile (ili ~/.bash_profile ako ne volite ljuske osim bash). Pogledajte Koja je razlika između njih i koju da koristim?

Napomene o ne-bash školjkama

U bash, ksh i zsh, izvoz je posebna sintaksa, a i PATH=~/opt/bin:$PATH i export PATH=~/opt/bin:$PATH rade pravu stvar čak. Na drugim Bourne/POSIX školjkama, kao što je crtica (koja je /bin/sh na mnogim sistemima), izvoz se analizira kao normalna naredba, što implicira dvije razlike:

  • ~ se raščlanjuje samo na početku riječi, osim u dodjeli (pogledajte Kako da dodam stazu matičnog direktorija koju će otkriti Unix za koju je potrebna naredba? ;
  • $PATH vanjski dvostruki navodniki se prekidaju ako PATH sadrži razmake ili \[*? .

Dakle, u školjkama kao što je crtica, export PATH=~/opt/bin:$PATH postavlja PATH na literalni niz ~/opt/bin/: nakon čega slijedi PATH vrijednost do prvog mjesta. PATH=~/opt/bin:$PATH (jednostavna dodjela) ne zahtijeva navodnike i radi sve kako treba. Ako želite da koristite izvoz u prenosivoj skripti, morate napisati export PATH="$HOME/opt/bin:$PATH" ili PATH=~/opt/bin:$PATH export PATH (ili PATH=$HOME/opt /bin: $PATH izvoz PATH za prenosivost čak i na Bourne školjku, koja ne prihvata eksport var=value i nije izvršila proširenje tilde).

¹ Ovo nije bilo tačno u Bourne školjkama (kao u stvarnoj Bourne ljusci, a ne modernim školjkama u stilu POSIX), ali je malo vjerovatno da ćete naići na tako stare školjke ovih dana. Sub>

U svakom slučaju radi, ali ne rade istu stvar: PATH elementi se provjeravaju s lijeva na desno. U prvom primjeru, izvršne datoteke u ~/opt/bin imat će prednost nad onima instaliranim u, na primjer, /usr/bin, što može, ali ne mora biti ono što želite.

Konkretno, opasno je iz sigurnosne perspektive dodavati putanje na početak, jer ako neko može dobiti pristup pisanju vašem ~/opt/bin , mogao bi staviti drugi ls, na primjer, koji ćete vjerovatno koristiti umjesto /bin/ls a da ne primetiš. Sada zamislite isto za ssh ili vaš pretraživač ili izbor... (Ista stvar tri puta stavite na svoju putanju.)

Zbunjen sam oko pitanja 2 (pošto je uklonjeno iz pitanja jer se odnosilo na nepovezano pitanje):

Koji je efikasan način za dodavanje dodatnih putanja različitim linijama? U početku sam mislio da bi ovo moglo pomoći:

Izvoz PATH=$PATH:~/opt/bin izvoz PATH=$PATH:~/opt/node/bin

Ali to nije zato što druga dodjela ne samo da dodaje ~/opt/node/bin već i prethodno dodijeljeni PATH .

Ovo je moguće rješenje:

Izvezi PATH=$PATH:~/opt/bin:~/opt/node/bin

Ali radi čitljivosti radije bih imao jedno odredište po putanji.

Ako kažeš

PATH=~/opt/bin

Ovo sve, koji će biti u vašem PATH. PATH je samo varijabla okruženja, i ako želite da dodate u PATH, morate ponovo izgraditi varijablu sa upravo onim sadržajem koji želite. Odnosno, ono što dajete kao primjer u pitanju 2 je upravo ono što želite da uradite, osim ako sam potpuno promašio poentu pitanja.

Koristim oba oblika u svom kodu. Imam opšti profil koji instaliram na svakoj mašini na kojoj radim, a koji izgleda ovako, da ugostim direktorijume koji potencijalno nedostaju:

Izvezi PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # dodaj opcione stavke na putanju za bindir u $HOME/local/bin $HOME/bin; uradi ako [ -d $bindir ]; onda PATH=$PATH:$(bindir) fi urađeno

Linux definira izvršnu putanju za pretraživanje pomoću varijable okoline $PATH. Da dodate direktorij /data/myscripts na početak varijable okoline $PATH, koristite sljedeće:

PATH=/data/myscripts:$PATH

Da dodate ovaj direktorij na kraj staze, koristite sljedeću naredbu:

PATH=$PATH:/data/myscripts

Ali prethodni nisu dovoljni jer kada postavite varijablu okruženja unutar skripte, ta promjena stupa na snagu samo unutar skripte. Ovo ograničenje je ograničeno na dva načina:

  • Ako izvezete varijablu okruženja unutar skripte, ona je efikasna u svim programima koje skripta poziva. Imajte na umu da ovo nije efikasno u programu koji je pozvao skriptu.
  • Ako program koji poziva skriptu to učini uključivanjem umjesto pozivanjem, sve promjene okruženja u skripti djelotvorne su na program koji poziva. Ovo uključivanje se može izvršiti pomoću naredbe dot ili naredbe izvora.

$HOME/myscript.sh izvor $HOME/myscript.sh

Uključivanje u osnovi uključuje skriptu "poziva" u skriptu "poziv". Ovo je slično #include u C. Dakle, djelotvorno je unutar skripte ili pozivajućeg programa. Ali, naravno, ovo nije efikasno za programe ili skripte koje poziva program koji poziva. Da biste ga učinili efektivnim sve do lanca poziva, morate pratiti postavku varijable okruženja pomoću naredbe za izvoz.

Kao primjer, bash shell program uključuje sadržaj datoteke .bash_profile uključivanjem. Dakle, stavite sljedeća 2 reda u .bash_profile:

PATH=$PATH:/data/myscripts izvoz PATH

efektivno stavlja te 2 linije koda u bash program. Dakle, u bash-u, varijabla $PATH uključuje $HOME/myscript.sh, a zbog naredbe za izvoz, svi programi koje poziva bash imaju modificiranu varijablu $PATH. A pošto se svi programi koje pokrenete iz bash prompt-a pozivaju bash-om, nova putanja se primjenjuje na sve što pokrenete iz bash prompt-a.

Suština je da da biste dodali novi direktorij stazi, trebate dodati ili dodati direktorij varijablu okruženja $PATH u skripti uključenoj u ljusku i morate izvesti varijablu okruženja $PATH.

Držao sam sa sobom već neko vrijeme dvije funkcije pathadd i pathrm koje pomažu u dodavanju elemenata na putanju bez brige o dupliciranju.

pathadd uzima jedan argument putanje i opcioni argument nakon, koji ako se doda bit će dodan u PATH , inače će ga dodati.

U bilo kojoj situaciji, ako dodajete putanju, vjerovatno želite poništiti sve što je već na putanji, tako da radije dodajem po defaultu.

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; onda ako [ " $2" = "posle" ] ; zatim PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;g")" )

Postavite ih u bilo koju skriptu koju želite da promijenite PATH okruženje i sada ste gotovi.

Pathadd "/foo/bar" pathadd "/baz/bat" nakon izvoza PATH

Garantovano je da nećete dodati putanju ako već postoji. Ako želite da se prvo pokrene /baz/bat.

Putanja "/baz/bat" pathadd "/baz/bat" izvoz PATH

Bilo koja putanja se sada može pomjeriti naprijed ako je već na stazi bez udvostručavanja.

Neprobojna metoda dodavanja/preparacije

Mnogo je razmatranja uključenih u odabir dodavanja i dodavanja. Mnogi od njih su obuhvaćeni drugim odgovorima, tako da ih ovdje neću ponavljati.

Važna stvar je da čak i ako sistemske skripte ne koriste ovo (pitam se zašto) *1, to je neprobojan način da dodate putanju (npr. $HOME/bin) varijablu okruženja PATH

PATH="$(PATH:+$(PATH):)$HOME/bin"

za dodavanje (umjesto PATH="$PATH:$HOME/bin") i

PATH="$HOME/bin$(PATH:+:$(PATH))"

dodati (umjesto PATH="$HOME/bin:$PATH")

Time se izbjegava lažna početna/završna dvotočka kada je $PATH u početku prazan, što može imati neželjene nuspojave i može biti noćna mora za pronalaženje (ovaj odgovor se ukratko bavi slučajem awk-way).

$(parametar:+riječ)

Ako je parametar null ili nije postavljen, ništa se ne zamjenjuje, inače se zamjenjuje riječ.

Dakle, $(PATH:+$(PATH):) se proširuje na: 1) ništa ako je PATH null ili nije postavljen, 2) $(PATH): ako je PATH postavljen.

Bilješka. Ovo je za bash.

*1 Upravo sam otkrio da skripte poput devtoolset-6/enable koriste ovo, $ cat /opt/rh/devtoolset-6/enable # Izvoz varijabli opšteg okruženja PATH=/opt/rh/devtoolset-6/root/usr /bin $(PATH:+:$(PATH)) ...

Ne mogu da govorim za druge distribucije, ali Ubuntu ima datoteku, /etc/environment, koja je podrazumevana putanja za pretragu za sve korisnike. Pošto moj računar koristim samo ja, tamo stavljam sve direktorijume koje želim na svom putu osim ako to nije privremeni dodatak koji sam stavio u skriptu.

Za mene (na Mac OS X 10.9.5) dodavanje naziva putanje (npr. /mypathname) u /etc/paths fajl je funkcionisalo veoma dobro.

Prije uređivanja, vraća se echo $PATH:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

Nakon uređivanja /etc/paths i ponovnog pokretanja ljuske, varijabla $PATH se dodaje sa /pathname. Zaista, echo $PATH vraća:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

Ono što se dogodilo je da je /mypathname dodato u varijablu $PATH.

Varijable okruženja ( varijabla okruženja) se koriste za pohranjivanje zajedničkih vrijednosti varijabli u različitim skriptama i programima. Takve varijable se mogu postaviti na određeno vrijeme, na primjer, za period rada određene terminalske ljuske, ili za period korisničke sesije, ili možete postaviti varijablu okruženja na globalnom nivou - za cijeli sistem.

Varijable okruženja

$HOME
Varijabla sadrži putanju do kućnog direktorija trenutnog korisnika. $USER
Trenutno korisničko ime $PATH
Lista direktorija za ljusku za traženje izvršnih programa. $PWD
Putanja do trenutnog radnog direktorija (ili pwd). Primjer: dir_path=$(pwd) . $SHELL
Zadani tumač $RANDOM
Generiše nasumični broj 0..32767 svaki put kada se pristupi promenljivoj. $SECONDS
Vrijeme u sek. od trenutka kada pokrenete komandnu ljusku. $? Rezultat prethodne naredbe. $HOSTNAME
Ime računara $HISTFILE
Putanja do datoteke istorije tumača $IFS
Lista znakova za razdvajanje komandi, parametara, elemenata niza (podrazumevano: razmak, tab, novi red) $PS1
Predložak stringa upita tumača.

Privremeno postavljanje varijable okruženja

Postavljanje varijable okruženja za period sesije:

# Za novi proces env varname=vrijednost [naredba] # Za trenutnu ljusku i sve njene podprocese izvezite varname=vrijednost [naredba]

Vrijednost varijable se zadržava sve dok se sistem ne pokrene ponovo.

Postavljanje konstantne vrijednosti

Varijable okruženja na nivou sistema se postavljaju kroz /etc/environment fajl:

OKRUŽENJE="dev"

Postavljanje varijable okruženja specifične za korisnika putem ~/.bashrc ili ~/.bash_profile datoteke:

PATH="$(PATH):/home/user/bin:"

Pažnja!

Datoteka ~/.bash_profile će se izvršiti kada se interpretator pokrene sa -l prekidačem. Ova datoteka se ne može pročitati kada ste prijavljeni lokalno!

Također morate imati na umu da će promjene stupiti na snagu tek nakon ponovnog pokretanja sesije!

Pregled vrijednosti varijable okruženja

Da vidite vrijednost varijable okruženja, postoji naredba printenv:

Printenv<имя_переменной>

#shell, #bash, #environment

Najbolji članci na ovu temu