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

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

Kada unesete naredbu u naredbeni redak, u osnovi govorite ljusci da pokrene izvršnu datoteku s danim 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 sustavu. 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 direktorijima treba tražiti izvršne programe ili pretražuje cijeli datotečni sustav?

Odgovor je jednostavan. Kada izdate naredbu, ljuska pretražuje sve direktorije navedene u korisničkoj varijabli $PATH za izvršnu datoteku s tim nazivom.

Ovaj vam članak pokazuje kako dodati direktorije u varijablu $PATH vašeg sustava.

Što je $PATH u Linuxu

Varijabla okoline $PATH je koloniziran popis direktorija s dvotočkom koji govori ljusci koje direktorije treba tražiti za izvršne datoteke.

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

Echo $PATH

Ispis ć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 smještene u dva različita direktorija, ljuska će pokrenuti datoteku koja se nalazi u direktoriju koji je prvi u $PATH.

Dodavanje direktorija vašem $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 možda želite imati namjenski direktorij za svoje osobne unose, ali ih moći pokrenuti bez navođenja apsolutne putanje do izvršnih datoteka. Da biste to učinili, trebate samo dodati direktorij u vaš $PATH.

Recimo da imate direktorij zvan bin koji se nalazi u vašem početnom direktoriju gdje pohranjujete svoje skripte ljuske. Za dodavanje direktorija vašoj varijabli $PATH:

Naredba izvoza izvozi modificiranu varijablu u podređena okruženja procesa ljuske.

Sada možete pokretati svoje skripte jednostavnim upisivanjem naziva izvršne skripte bez navođenja pune staze do izvršne datoteke.

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

Kako bi promjena bila trajna, trebate definirati varijablu $PATH u konfiguracijskim datotekama ljuske. Na većini distribucija Linuxa, prilikom pokretanja nove sesije, varijable okoline čitaju se 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 sustava.
  • Konfiguracijske datoteke za pojedinačne korisničke ljuske. Na primjer, ako koristite Bash, možete postaviti varijablu $PATH u datoteci ~/.bashrc, a ako koristite Zsh, naziv datoteke je ~/.zshrc.

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

Nano ~/.bashrc

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

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

Izvor ~/.bashrc

Kako 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 prilično je jednostavno. To vam omogućuje pokretanje naredbi i skripti pohranjenih na nestandardnim lokacijama bez potrebe za unosom pune staze 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.

Što je? Mnoge naredbe koje unosite u naredbeni redak zahtijevaju korištenje vanjskog programa koji se učitava iz datotečnog sustava. Na primjer, naredbe poput mkdir i wc zapravo se nalaze u mapi /bin.

Kada unesete instrukciju koju Bash shell ne prepoznaje, ona je pokušava izvršiti kao program i vraća pogrešku ako ne pronađe program s tim nazivom. I to se ne odnosi samo na osnovne naredbe koje smo pogledali, jer iz naredbenog retka možete pokrenuti bilo koji program.


Ali kako, ako je prisutan u datotečnom sustavu, Linux zna koje programe treba pokrenuti iz kojih direktorija? OS koristi varijablu okoline sustava za određivanje podskupa mapa za pretraživanje kada primi nepoznatu naredbu. Ova se varijabla naziva PATH i može se prikazati sljedećom echo naredbom (potreban je simbol $):

Echo $PATH

Izlaz ove naredbe izgledat će kao sljedećih sedam apsolutnih staza mapa, odvojenih dvotočkama:

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

Kad god unesete nepoznatu naredbu, Linux će pregledati svaku od mapa navedenih u varijabli okruženja redoslijedom kojim su navedeni, pokušavajući pronaći program s istim imenom. Ako je program pronađen, pokreće se; inače se prikazuje poruka o pogrešci. Ali nećete pogriješiti ako svoje voljeno srebrno prstenje kupite na poklon. Srebro će ukrasiti svaku ženu!

Ovih sedam mapa omogućuje jednostavan pristup svim glavnim programima u operativnom sustavu, uključujući . Nijedan program izvan ovih sedam mapa ne može se pokrenuti jednostavnim upisivanjem naziva u naredbeni redak.

Na primjer, preuzeli ste uslužni program dnevnika s interneta u svoju početnu mapu. Ako unesete njegovo ime u naredbeni redak, primit ćete poruku o pogrešci jer se nalazi u mapi koja nije uključena u sistemsku stazu. Za pokretanje ovog programa unesite sljedeći redak (zapamtite, simbol ~ je skraćenica za vašu početnu mapu):

Ako ste ga spremili u mapu izvan svoje navedene staze, morat ćete unijeti apsolutnu stazu i naziv datoteke za pokretanje uslužnog programa.

Naravno, pretpostavlja se da je dnevnik jednostavan samostalan program koji ne zahtijeva instalaciju, jer će većina glavnih aplikacija smjestiti izvršnu datoteku programa negdje na vašu navedenu stazu tijekom procesa instalacije. Kao ovo PATH varijabla okruženja, uživajte za svoje zdravlje!

Pitam se gdje bi se nova staza trebala dodati varijabli okruženja PATH. Znam da se to može postići uređivanjem .bashrc (na primjer), ali nije jasno kako to učiniti.

Tako:

Izvezi PATH=~/opt/bin:$PATH

Izvezi PATH=$PATH:~/opt/bin

11 odgovora

Jednostavan materijal

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

ovisno o tome želite li kod ~/opt/bin dodati na kraj (za pretraživanje svih ostalih direktorija ako postoji program s istim imenom u više direktorija) ili na početak (za pretraživanje prije svih ostalih direktorija).

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 izvoziti ako je varijabla već u okruženju: svaka promjena vrijednosti varijable odražava se u okruženju.¹ PATH je gotovo uvijek u okruženju; svi ga unix sustavi instaliraju vrlo rano (zapravo obično u prvom procesu).

Ako je vaš PATH kreiran od strane mnogo različitih komponenti, mogli biste završiti s dvostrukim unosima. Pogledajte Kako dodati stazu u vaš početni direktorij koju će otkriti Unix, koja naredba? i Uklonite duple $PATH unose pomoću naredbe awk da biste izbjegli duplikate ili ih uklonili.

Gdje staviti

Imajte na umu da ~/.bash_rc ne može čitati niti jedan program, a ~/.bashrc je konfiguracijska datoteka za interaktivne bash instance. Ne biste trebali definirati varijable okoline u ~/.bashrc. Ispravno mjesto za definiranje varijabli okoline kao što je PATH je ~/.profile (ili ~/.bash_profile ako ne volite ljuske osim bash). Pogledajte Koja je razlika između njih i koju bih trebao koristiti?

Napomene o ne-bash školjkama

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

  • ~ se raščlanjuje samo na početku riječi, osim u dodjelama (pogledajte Kako dodati stazu matičnog direktorija koju će otkriti Unix koji zahtijeva naredbu? ;
  • $PATH vanjski dvostruki navodnici prekidaju se ako PATH sadrži razmake ili \[*? .

Dakle, u ljuskama kao što je dash, izvoz PATH=~/opt/bin:$PATH postavlja PATH na literalni niz ~/opt/bin/: nakon čega slijedi PATH vrijednost do prvog mjesta. PATH=~/opt/bin:$PATH (jednostavno dodjeljivanje) ne zahtijeva navodnike i radi sve kako treba. Ako želite koristiti izvoz u prijenosnoj skripti, morate napisati izvoz PATH="$HOME/opt/bin:$PATH" ili PATH=~/opt/bin:$PATH izvoz PATH (ili PATH=$HOME/opt /bin: $PATH izvoz PATH za prenosivost čak i na Bourneovu ljusku, koja ne prihvaća izvoz var=vrijednost i nije radila proširenje tilde).

¹ To nije bilo točno u Bourneovim ljuskama (kao u stvarnoj Bourneovoj ljusci, a ne u modernim ljuskama u POSIX stilu), ali malo je vjerojatno da ćete ovih dana naići na tako stare ljuske. Sub>

Oba načina funkcioniraju, ali ne rade isto: PATH elementi se provjeravaju slijeva nadesno. U prvom primjeru, izvršni fajlovi u ~/opt/bin će imati prednost nad onima instaliranim u, na primjer, /usr/bin, što može, ali i ne mora biti ono što želite.

Konkretno, opasno je iz sigurnosne perspektive dodavati staze naprijed, jer ako netko može dobiti pristup pisanja na vaš ~/opt/bin, mogao bi staviti još jedan ls na primjer, koji ćete vjerojatno koristiti umjesto /bin/ls ne primijetivši. Sada zamislite isto za ssh ili vaš preglednik ili izbor... (Ista stvar tri puta stavljena na vaš put.)

Zbunjen sam u vezi s pitanjem 2 (budući da je uklonjeno iz pitanja jer se odnosilo na nepovezani problem):

Koji je učinkovit način za dodavanje dodatnih staza različitim linijama? U početku sam mislio da bi ovo moglo poslužiti:

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

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

Ovo je moguće zaobilazno rješenje:

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

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

Ako kažeš

PATH=~/opt/bin

Ovaj svi, koji će biti na vašem PUTU. PATH je samo varijabla okruženja, a ako želite dodati PATH, morate ponovno izgraditi varijablu s točno onim sadržajem koji želite. Odnosno, ono što dajete kao primjer u pitanju 2 je upravo ono što želite učiniti, osim ako nisam potpuno promašio bit pitanja.

Koristim oba oblika u svom kodu. Imam opći profil koji instaliram na svako računalo na kojem radim, a koji izgleda ovako za hostiranje direktorija koji potencijalno nedostaju:

Izvezi PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # dodaj neobavezne stavke putanji za bindir u $HOME/local/bin $HOME/bin; učiniti if [ -d $bindir ]; zatim PATH=$PATH:$(bindir) fi gotovo

Linux definira putanju pretraživanja izvršne datoteke s varijablom okoline $PATH. Za dodavanje direktorija /data/myscripts na početak varijable okoline $PATH koristite sljedeće:

PATH=/data/myscripts:$PATH

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

PATH=$PATH:/data/myscripts

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

  • Ako izvezete varijablu okoline unutar skripte, ona je učinkovita unutar svih programa koje skripta poziva. Imajte na umu da ovo nije učinkovito u programu koji je pozvao skriptu.
  • Ako program koji poziva skriptu to čini uključivanjem umjesto pozivanjem, sve promjene okruženja skripte vrijede za program koji poziva. Ovo uključivanje može se izvršiti pomoću naredbe točka ili naredbe izvora.

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

Uključivanje u osnovi uključuje "callable" skriptu u "call" skripti. Ovo je slično #include u C. Dakle, učinkovito je unutar skripte ili pozivajućeg programa. Ali naravno, to nije učinkovito za programe ili skripte koje poziva program koji poziva. Da bi bio učinkovit sve do lanca poziva, morate slijediti postavku varijable okruženja pomoću naredbe izvoza.

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

PATH=$PATH:/data/myscripts izvoz PATH

učinkovito stavlja te 2 linije koda u bash program. Dakle, u bashu, varijabla $PATH uključuje $HOME/myscript.sh, a zbog izjave o izvozu, svi programi koje poziva bash imaju varijablu $PATH izmijenjenu. A budući da sve programe koje pokrenete iz bash prompta poziva bash, novi se put primjenjuje na sve što pokrenete iz bash prompta.

Zaključak je da za dodavanje novog direktorija stazi morate dodati ili dodati direktorij varijabli okruženja $PATH u skripti uključenoj u ljusku i morate izvesti varijablu okruženja $PATH.

Već neko vrijeme imam dvije funkcije pathadd i pathrm koje pomažu u dodavanju elemenata putanji bez brige o dupliciranju.

pathadd uzima jedan argument staze i opcijski argument iza, koji ako se doda bit će dodan u PATH, inače će ga dodati.

U bilo kojoj situaciji, ako dodajete stazu, vjerojatno želite nadjačati sve što je već u stazi, tako da radije dodajem prema zadanim postavkama.

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then if [ " $2" = "nakon" ] ; 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 u kojoj želite promijeniti PATH okruženje i sada ste gotovi.

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

Zajamčeno je da nećete dodati put ako već postoji. Ako želite da se /baz/bat prvi pokrene.

Pathrm "/baz/bat" pathadd "/baz/bat" izvoz PATH

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

Neprobojni dodatak/metoda predpripreme

Mnogo je razmatranja uključenih u odabir dodavanja i dodavanja. Mnogi od njih su pokriveni u drugim odgovorima, pa ih neću ponavljati ovdje.

Važno je da čak i ako sistemske skripte ne koriste ovo (pitam se zašto) *1, to je neprobojan način za dodavanje staze (npr. $HOME/bin) varijabli 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 dvotočka na početku/završetku kada je $PATH inicijalno prazan, što može imati neželjene nuspojave i može biti prava noćna mora (ovaj odgovor ukratko se bavi slučajem awk -way).

$(parametar:+riječ)

Ako je parametar nula 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 nula 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 # Općenite varijable okruženja izvoz PATH=/opt/rh/devtoolset-6/root/usr /bin $(PATH:+:$(PATH)) ...

Ne mogu govoriti o drugim distribucijama, ali Ubuntu ima datoteku, /etc/environment, koja je zadana staza pretraživanja za sve korisnike. Budući da moje računalo koristim samo ja, tamo stavljam direktorije koje želim na svoj put, osim ako to nije privremeni dodatak koji sam stavio u skriptu.

Za mene (na Mac OS X 10.9.5) dodavanje naziva staze (npr. /mypathname) u datoteku /etc/paths funkcionira jako 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 s /pathname. Doista, echo $PATH vraća:

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

Ono što se dogodilo je da je /mypathname dodan varijabli $PATH.

Varijable okruženja ( varijabla okoline) koriste se za pohranu zajedničkih vrijednosti varijabli u različitim skriptama i programima. Takve varijable možete postaviti za vrijeme, na primjer, za razdoblje rada određene terminalne ljuske, ili za razdoblje korisničke sesije, ili možete postaviti varijablu okruženja na globalnoj razini - za cijeli sustav.

Varijable okoline

$HOME
Varijabla sadrži stazu do matičnog direktorija trenutnog korisnika. $USER
Trenutno korisničko ime $PATH
Popis direktorija za ljusku za traženje izvršnih programa. $OSO
Put do trenutnog radnog direktorija (ili pwd). Primjer: dir_path=$(pwd) . $ŠKOLJKA
Zadani tumač $RANDOM
Generira nasumični broj 0..32767 svaki put kada se pristupi varijabli. $SECONDS
Vrijeme u sek. od trenutka kada pokrenete komandnu ljusku. $? Rezultat prethodne naredbe. $HOSTNAME
Naziv računala $HISTFILE
Put do datoteke povijesti tumača $IFS
Popis znakova za razdvajanje naredbi, parametara, elemenata niza (zadano: razmak, tabulator, novi red) $PS1
Predložak niza upita tumača.

Privremeno postavljanje varijable okoline

Postavljanje varijable okruženja za razdoblje sesije:

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

Vrijednost varijable se zadržava dok se sustav ponovno ne pokrene.

Postavljanje konstantne vrijednosti

Varijable okruženja na razini sustava postavljaju se kroz datoteku /etc/environment:

OKOLIŠ="dev"

Postavljanje varijable okoline specifične za korisnika putem ~/.bashrc ili ~/.bash_profile:

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

Pažnja!

Datoteka ~/.bash_profile će se izvršiti kada se prevoditelj pokrene s prekidačem -l. Kada je prijavljena lokalno, ova datoteka nije čitljiva!

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

Pregled vrijednosti varijable okoline

Za pregled vrijednosti varijable okruženja postoji naredba printenv:

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

#školjka, #bash, #okoliš

Najbolji članci na temu