Linux staza kako odrediti putanje mape. PATH varijabla okruženja. Dodavanje korisničkih i sistemskih varijabli okruženja u Linuxu

Kada unesete naredbu naredbeni redak, vi u osnovi govorite ljusci da pokrene izvršnu datoteku s danim imenom. Na Linuxu ove izvršni programi, poput 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 koje direktorije treba tražiti za izvršne programe ili pretražuje li ljuska svuda sustav datoteka?

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 pod nazivom bin koji se nalazi u vašem početnom direktoriju u kojem 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 pokrenuti 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 imenik doda svima korisnicima sustava$PATH.
  • 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č teksta i dodajte sljedeći redak na kraju:

Nano ~/.bashrc

Izvoz 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 sve Linux distribucija, 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 postoji datoteka Linux sustav zna koje programe 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 putanja mapa, odvojenih dvotočkama:

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

Svaki put kada uđete u nepoznato Linux naredbe pregledat će 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 osiguravaju lak pristup na sve glavne programe u operacijski sustav, 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!

izvoz PATH=~/opt/bin:$PATH

Izvezi PATH=$PATH:~/opt/bin

Web obrazac za prikupljanje rješenja 9 za “Kako ispravno dodati stazu u PATH?”

Jednostavne stvari

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

ovisno o tome želite li dodati ~/opt/bin na kraju (za pretraživanje svih ostalih direktorija ako postoji program s istim imenom u više direktorija) ili na početku (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 redoslijeda sasvim su 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 unix sustavi instalirajte ga vrlo rano (obično u prvom procesu, zapravo).

Ako je vaš PATH sastavljen od različitih komponenti, mogli biste završiti s dvostrukim unosima. Pogledajte Kako dodati stazu u izvorni direktorij koji će otkriti Unix, koja je naredba? i uklonite duple $PATH unose pomoću naredbe awk kako biste izbjegli dodavanje duplikata ili njihovo uklanjanje.

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 vam ne trebaju ljuske koje nisu bash). Vidite koja je razlika između njih i koji bih trebao koristiti?

Napomene o ne-bash školjkama

U bash, ksh i zsh, izvoz je posebna sintaksa, i PATH=~/opt/bin:$PATH i izvoz PATH=~/opt/bin:$PATH rade sve kako treba. 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 analizira samo na početku riječi, osim u dodjelama (pogledajte odjeljak "Kako dodati stazu u izvorni direktorij koji će Unix otkriti, koja naredba?").
  • $PATH izvan dvostrukih navodnika prekida se ako PATH sadrži razmake ili \[*? ,

Dakle, u ljuskama sličnim crticama, izvoz PATH=~/opt/bin:$PATH postavlja PATH na literalni niz ~/opt/bin/: nakon čega slijedi vrijednost PATH do prvog mjesta. PATH=~/opt/bin:$PATH (nejasna dodjela) ne zahtijeva navodnike i čini pravu stvar. Ako želite koristiti izvoz u prijenosnoj skripti, morate napisati izvoz PATH="$HOME/opt/bin:$PATH" .

¹ To nije bilo točno u Bourneovim raketama (kao u pravoj Bourneovoj granati, a ne u modernim granatama u stilu POSIX-a), ali malo je vjerojatno da ćete ovih dana naići na tako stare granate.

Svejedno radi, ali oni ne rade isto: PATH elementi se provjeravaju s lijeva na desno. U prvom primjeru izvršne datoteke u ~/opt/bin će imati prednost nad onima instaliranim u npr. /usr/bin, što može, ali i ne mora biti ono što želite.

Osobito iz sigurnosne perspektive, opasno je dodavati staze naprijed, jer ako netko može dobiti pristup za pisanje u vaš ~/opt/bin, mogao bi, na primjer, postaviti druge l-ove koje biste vjerojatno koristili umjesto / bin/ls bez primjećivanja Sada zamislite isto kao za ssh ili vaš preglednik ili izbor... (Istu stvar možete učiniti tri puta na svom putu.)

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

Što učinkovita metoda 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 ne jer druga dodjela ne samo da dodaje ~/opt/node/bin već i sve prethodno dodijeljene PATH.

Ovo je moguće 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,što će biti na tvom PUTU. PATH je samo varijabla okruženja, a ako želite dodati PATH, morate ponovno izgraditi varijablu s točno onim sadržajem koji želite. Dakle, ono što dajete kao primjer u pitanju 2 je upravo ono što želite učiniti, osim ako potpuno ne promašujem 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 kako bi se prilagodio direktorijima 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 određuje stazu pretraživanja izvršne datoteke iz okoline $PATH. Za dodavanje direktorija /data/myscripts na vrh okruženja $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 samo dva načina:

  • Ako izvezete varijablu okoline u skriptu, ona je učinkovita u svim programima koje skripta poziva. Imajte na umu da ovo nije učinkovito u programu koji se zove skripta.
  • 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 to naravno nije učinkovito za bilo koje 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, dodavanje 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 bash varijabla$PATH uključuje $HOME/myscript.sh, a zbog izjave o izvozu, svi programi koje poziva bash imat će modificirani $PATH. A budući da sve programe pokrenute iz bash prompta poziva bash, novi put vrijedi za 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.

dodatne informacije Ovdje

Već neko vrijeme sa sobom imam dvije funkcije pathadd i pathrm koje pomažu dodati elemente putanji bez brige o dupliciranju.

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

U gotovo svakoj situaciji, ako dodate 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 za koju želite promijeniti PATH okruženje i sada to možete učiniti.

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

Zajamčeno je da nećete dodati put ako već postoji. Ako sada želite da /baz/bat bude na početku.

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

Bilo koja staza se sada može dovesti u prvi plan ako je već na stazi bez udvostručavanja.

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

Evo mog rješenja:

PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: "!x[$0]++" | sed "s/\(.*\).\(1\)/\1 /")

Lijepa lagana podstava koja ne ostavlja tragove:

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 u $PATH.

Za dodavanje nove staze u PATH okruženje PATH:

Izvezi PATH=$PATH:/novi-put/

Kako bi se ova promjena primijenila na svaku ljusku koju otvorite, dodajte je u datoteku koju će ljuska pozvati kada je pozovete. U različitim školjkama to može biti:

  • Bash Shell: ~/.bash_profile, ~/.bashrc ili profil
  • Korn Shell: ~/.kshrc ili .profile
  • Z Shell: ~/.zshrc ili .zprofile

Na primjer

# export PATH=$PATH:/root/learning/bin/ # source ~/.bashrc # echo $PATH

Možete vidjeti navedeni put u gornjem izlazu.

Sve datoteke u Linuxu imaju određenu adresu u datotečnom sustavu s kojom im možemo pristupiti pomoću upravitelja datotekama ili pomoćnih programa konzole. Ovo je prilično jednostavna tema, ali mnogi početnici imaju poteškoća s njom.

U današnjem kratkom članku ćemo pogledati što je put do Linux datoteke, što može biti, kako je ispravno napisati i još mnogo toga. Ako ste prije imali poteškoća s tim, nakon čitanja članka sve će postati potpuno jasno.

Putanja datoteka u Linuxu

Datotečni sustav Linuxa uvelike se razlikuje od sustava Windows. Nećemo razmatrati njegovu strukturu; to je učinjeno ranije. Usredotočit ćemo se na rad s datotekama.

Najvažnija razlika je u tome što adresa datoteke ne počinje od pogona, na primjer, C:\ ili D:\ kao što se događa u Windowsima, već od korijena, korijenskog direktorija sustava na koji su povezani svi ostali. Njegova adresa - /. I ovdje treba govoriti o adresama. Putovi datoteka u Linuxu koriste kosu crtu "/" za odvajanje direktorija u adresi, a to se razlikuje od onoga što ste navikli vidjeti na Windowsima - \.

Na primjer, ako je u Prozori puni put do datoteke na radnoj površini izgledao je kao C:\Users\Sergiy\Desktop\, tada bi put datoteke u Linuxu bio jednostavno /home/sergiy/desktop/. S ovim je do sada sve jednostavno i jasno. Ali problemi nastaju dalje.

U operativnom sustavu Linux može postojati nekoliko vrsta putova datoteka. Pogledajmo koje staze postoje u Linuxu:

  • Potpuni, apsolutni Linux put od korijena datotečnog sustava- već ste vidjeli ovaj put u gornjem primjeru, počinje od korijena “/” i opisuje cijeli put do datoteke;
  • Linux relativni put- ovo je put do datoteke u odnosu na trenutnu mapu; takvi putovi često uzrokuju zabunu.
  • Putanja u odnosu na početnu mapu trenutnog korisnika.- put u datotečnom sustavu, ali ne iz korijena, već iz mape trenutnog korisnika.

Pogledajmo sada pobliže kako ti putovi izgledaju u Linuxu, a također pogledajmo nekoliko primjera da bude potpuno jasno. Za demonstraciju ćemo koristiti pomoćni program ls koji je dizajniran za pregled sadržaja direktorija.

Na primjer, imamo direktorij poput ovog u našoj početnoj mapi s četiri datoteke u njemu:

Ovako će izgledati puni Linux put do jedne od datoteka:

ls /home/sergiy/tmp/file1

Ovo je već relativna Linux staza, koja počinje od početne mape, označena je kao ~/. Napomena, ne ~, naime ~/. Zatim možete odrediti podmape, u našem slučaju tmp:

Pa, ili put datoteke u Linuxu, u odnosu na trenutnu mapu:

Prva poveznica pokazuje na trenutnu mapu (.), druga (..) pokazuje na višu mapu. To otvara još veće mogućnosti za navigaciju katalogom. Na primjer, za pozivanje na datoteku u trenutnoj mapi možete koristiti sljedeću konstrukciju:

Ovo nema koristi kada gledate sadržaj datoteke. Ali to je vrlo važno prilikom izvođenja programa. Jer program će se prvo tražiti u PATH okruženju, a tek onda u ovoj mapi. Stoga, ako trebate pokrenuti program koji se nalazi u trenutnoj mapi i zove se potpuno isto kao onaj u direktoriju /bin, tada bez eksplicitne poveznice trebate potražiti datoteku u trenutnoj mapi, ništa neće uspjeti.

Takve se konstrukcije mogu pojaviti prilično često prilikom prevođenja programa. Sve te simbole i staze linux datoteka možete koristiti ne samo u terminalu, već iu bilo kojem upravitelj datoteka, što može biti vrlo zgodno.

Ali Linux terminal pruža još veće mogućnosti. Možete koristiti jednostavne zamjenske znakove izravno u adresama datoteka ili imenika. Na primjer, možete navesti sve datoteke koje počinju s f:

Ili čak možete pretraživati ​​ne samo u mapi tmp, već u bilo kojoj podmapi vaše početne mape:

I sve će to raditi, možda nije uvijek potrebno i praktično. Ali u određenim situacijama može puno pomoći. Ove su funkcije implementirane na razini Bash ljuske, tako da ih možete koristiti u bilo kojoj naredbi. Shell gleda koliko je datoteka pronađeno i poziva naredbu za svaku od njih.

zaključke

To je sve. Sada znate sve što vam je potrebno ne samo da ispravno napišete put do linux datoteka, ali i izvoditi složenije akcije, kao što je traženje datoteka ili kretanje kroz direktorije pomoću naredbe cd. Ako imate pitanja, pitajte u komentarima!

Povezane objave:


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 redoslijeda sasvim su 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 unix sustavi ga instaliraju vrlo rano (obično u prvom procesu, zapravo).

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 mogu dodati stazu matičnog direktorija koju će otkriti Unix koji zahtijeva naredbu? ;
  • $PATH vanjski dvostruki navodnici prekida 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 provjeravaju se 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 ne povezani 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 hosting 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 to naravno nije učinkovito za bilo koje 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 izvoza, svi programi koje poziva bash imaju modificiranu varijablu $PATH. 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č 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će 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.