Pot do Linuxa, kako določiti poti do map. Spremenljivka okolja PATH. Dodajanje uporabniških in sistemskih okoljskih spremenljivk v Linuxu

Ko vnesete ukaz ukazna vrstica, lupini v bistvu sporočate, naj zažene izvršljivo datoteko z danim imenom. Na Linuxu te izvedljivi programi, kot so ls, find, file in drugi, običajno živijo v več različnih imenikih v vašem sistemu. Vsako datoteko z izvršljivimi dovoljenji, shranjeno v teh imenikih, je mogoče zagnati od koder koli. Najpogostejši imeniki, ki vsebujejo izvršljive programe, so /bin, /sbin, /usr/sbin, /usr/local/bin in /usr/local/sbin.

Toda kako lupina ve, v katerih imenikih naj išče izvršljive programe, ali lupina išče vsepovsod datotečni sistem?

Odgovor je preprost. Ko izdate ukaz, ukazna lupina poišče izvršljivo datoteko s tem imenom v vseh imenikih, navedenih v uporabniški spremenljivki $PATH.

Ta članek vam pokaže, kako dodate imenike v sistemsko spremenljivko $PATH.

Kaj je $PATH v Linuxu

Okoljska spremenljivka $PATH je z dvopičjem koloniziran seznam imenikov, ki lupini pove, katere imenike naj išče izvršljive datoteke.

Če želite preveriti, katere imenike imate v spremenljivki $PATH, lahko uporabite ukaz printenv ali echo:

Echo $PATH

Izhod bo videti nekako takole:

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

Če imate dve izvedljivi datoteki z istim imenom, ki se nahajata v dveh različnih imenikih, bo lupina zagnala datoteko, ki je v imeniku, ki je prvi v $PATH.

Dodajanje imenika v $PATH

Obstajajo situacije, ko boste morda želeli dodati druge imenike vaši spremenljivki $PATH. Na primer, nekateri programi so lahko nameščeni na različnih lokacijah ali pa boste morda želeli imeti namenski imenik za svoje osebne vnose, vendar jih boste lahko zagnali brez podajanja absolutne poti do izvedljivih datotek. Če želite to narediti, morate samo dodati imenik v $PATH.

Recimo, da imate imenik z imenom bin v domačem imeniku, v katerem shranjujete svoje lupinske skripte. Če želite svoji spremenljivki $PATH dodati imenik:

Ukaz za izvoz izvozi spremenjeno spremenljivko v podrejena okolja procesov lupine.

Zdaj lahko zaženete svoje skripte tako, da preprosto vnesete ime izvršljivega skripta, ne da bi navedli celotno pot do izvršljive datoteke.

Vendar je ta sprememba začasna in vpliva samo na trenutno sejo lupine.

Če želite, da bo sprememba trajna, morate v konfiguracijskih datotekah lupine definirati spremenljivko $PATH. V večini distribucij Linuxa se ob začetku nove seje spremenljivke okolja preberejo iz naslednjih datotek:

  • Konfiguracijske datoteke globalne lupine, kot sta /etc/environment in /etc/profile. Uporabite to datoteko, če želite, da se nov imenik doda vsem uporabniki sistema$PATH.
  • Konfiguracijske datoteke za lupine posameznih uporabnikov. Na primer, če uporabljate Bash, lahko nastavite spremenljivko $PATH v datoteki ~/.bashrc, in če uporabljate Zsh, je ime datoteke ~/.zshrc.

V tem primeru bomo nastavili spremenljivko v datoteki ~/.bashrc. Odprite datoteko v urejevalnik besedil in na koncu dodajte naslednjo vrstico:

Nano ~/.bashrc

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

Shranite datoteko in naložite novo vrednost $PATH v trenutno sejo lupine z:

Vir ~/.bashrc

Če želite potrditi, da je bil imenik uspešno dodan, natisnite njegovo vrednost $PATH tako, da vnesete:

Echo $PATH

Zaključek

Dodajanje novih imenikov vaši uporabniški ali globalni $PATH je povsem preprosto. To vam omogoča zagon ukazov in skriptov, shranjenih na nestandardnih lokacijah, ne da bi morali vnesti celotno pot do izvedljive datoteke.

Enaka navodila veljajo za vse Distribucija Linuxa, vključno z , CentOS, RHEL, Debian in Linux Mint.

Če imate kakršna koli vprašanja, pustite komentar.

Kaj je to? Številni ukazi, ki jih vnesete v ukazni poziv, zahtevajo uporabo zunanjega programa, ki se naloži iz datotečnega sistema. Na primer, ukazi, kot sta mkdir in wc, se dejansko nahajajo v mapi /bin.

Ko vnesete navodilo, ki ga lupina Bash ne prepozna, ga poskuša izvesti kot program in vrne napako, če ne najde programa s tem imenom. In to ne velja le za osnovne ukaze, ki smo si jih ogledali, saj lahko iz ukazne vrstice zaženete kateri koli program.


Ampak kako, če obstaja datoteka sistem Linux ve, katere programe zagnati iz katerih imenikov? OS uporablja spremenljivko sistemskega okolja za določitev podmnožice map za iskanje ob prejemu neznanega ukaza. Ta spremenljivka se imenuje PATH in jo lahko prikažete z naslednjim ukazom echo (potreben je simbol $):

Echo $PATH

Izhod tega ukaza bo videti kot naslednjih sedem absolutnih poti do map, ločenih z dvopičjem:

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

Vsakič, ko vnesete neznano Linux ukazi bo pregledal vsako od map, določenih v spremenljivki okolja, v vrstnem redu, v katerem so bili podani, in poskušal najti program z enakim imenom. Če je program najden, se zažene; sicer se prikaže sporočilo o napaki. Ne bo pa napaka, če boste svoje ljube srebrne prstane kupili za darilo. Srebro bo okrasilo vsako žensko!

Teh sedem map zagotavlja enostaven dostop na vse glavne programe v operacijski sistem, vključno z . Programov zunaj teh sedmih map ni mogoče zagnati tako, da preprosto vnesete njihovo ime v ukazno vrstico.

Na primer, pripomoček za dnevnik ste prenesli iz interneta v domačo mapo. Če vnesete njegovo ime v ukazni poziv, boste prejeli sporočilo o napaki, ker je v mapi, ki ni vključena v sistemsko pot. Če želite zagnati ta program, vnesite naslednjo vrstico (ne pozabite, da je simbol ~ okrajšava za vašo domačo mapo):

Če ste jo shranili v mapo zunaj vaše podane poti, boste morali za zagon pripomočka vnesti absolutno pot in ime datoteke.

Seveda se domneva, da je dnevnik preprost samostojen program, ki ne zahteva namestitve, ker bo večina večjih aplikacij med postopkom namestitve postavila izvedljivo datoteko programa nekam na vašo določeno pot. Všečkaj to Spremenljivka okolja PATH, uživajte za svoje zdravje!

izvoz PATH=~/opt/bin:$PATH

Izvoz PATH=$PATH:~/opt/bin

9 rešitev zbira spletni obrazec za "Kako pravilno dodati pot do PATH?"

Preproste stvari

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

odvisno od tega, ali želite dodati ~/opt/bin na koncu (za iskanje po vseh drugih imenikih, če obstaja program z istim imenom v več imenikih) ali na začetku (za iskanje pred vsemi drugimi imeniki).

Dodate lahko več vnosov hkrati. PATH=$PATH:~/opt/bin:~/opt/node/bin ali spremembe vrstnega reda so v redu.

Če je spremenljivka že v okolju, vam ni treba izvažati: vsaka sprememba vrednosti spremenljivke se odraža v okolju.PATH je skoraj vedno v okolju; Vse sistemi unix namestite zelo zgodaj (pravzaprav običajno že v prvem postopku).

Če je vaš PATH sestavljen iz različnih komponent, lahko na koncu dobite podvojene vnose. Glejte Kako dodati pot v izvorni imenik, ki ga bo zaznal Unix, kaj je ukaz? in odstranite podvojene vnose $PATH z ukazom awk, da se izognete dodajanju dvojnikov ali njihovemu odstranjevanju.

Kam postaviti

Upoštevajte, da ~/.bash_rc ne more prebrati noben program, ~/.bashrc pa je konfiguracijska datoteka za interaktivne primerke bash. Ne bi smeli definirati spremenljivk okolja v ~/.bashrc. Pravilno mesto za definiranje spremenljivk okolja, kot je PATH, je ~/.profile (ali ~/.bash_profile, če ne potrebujete lupin, ki niso bash). Poglejte, kakšna je razlika med njima in katerega naj uporabim?

Opombe o lupinah, ki niso bash

V bash, ksh in zsh je izvoz posebna sintaksa in tako PATH=~/opt/bin:$PATH kot izvoz PATH=~/opt/bin:$PATH naredita vse pravilno. Na drugih lupinah Bourne/POSIX, kot je dash (ki je v mnogih sistemih /bin/sh), je izvoz razčlenjen kot običajen ukaz, kar pomeni dve razliki:

  • ~ je razčlenjeno le na začetku besede, razen pri dodelitvah (glejte razdelek "Kako dodati pot do izvornega imenika, ki ga bo zaznal Unix, kateri ukaz?").
  • $PATH zunaj dvojnih narekovajev se prekine, če PATH vsebuje presledke ali \[*? ,

Torej v pomišljaju podobnih lupinah izvoz PATH=~/opt/bin:$PATH nastavi PATH na dobesedni niz ~/opt/bin/:, ki mu sledi vrednost PATH do prvega mesta. PATH=~/opt/bin:$PATH (mehka dodelitev) ne zahteva narekovajev in deluje pravilno. Če želite uporabiti izvoz v prenosnem skriptu, morate napisati izvoz PATH="$HOME/opt/bin:$PATH" .

¹ To ni veljalo za rakete Bourne (kot za prave Bournove lupine, ne za sodobne lupine v slogu POSIX), vendar je malo verjetno, da boste dandanes naleteli na tako stare lupine.

Vseeno deluje, vendar ne počnejo iste stvari: elementi PATH se preverjajo od leve proti desni. V prvem primeru izvršljive datoteke v ~/opt/bin bodo imeli prednost pred tistimi, ki so nameščeni v npr.

Zlasti z varnostnega vidika je nevarno dodajati poti v ospredje, kajti če lahko nekdo pridobi pisalni dostop do vašega ~/opt/bin, lahko na primer postavi druge l-je, ki bi jih verjetno uporabili namesto / bin/ls, ne da bi opazili Zdaj si predstavljajte isto kot za ssh ali vaš brskalnik ali izbiro ... (Isto stvar lahko storite trikrat na vaši poti.)

Zmedlo me je 2. vprašanje (saj je bilo odstranjeno iz vprašanja, ker je bilo povezano z nepovezano težavo):

Kaj učinkovita metoda dodajanje dodatnih poti v različne vrstice? Sprva sem mislil, da bi to lahko pomagalo:

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

vendar ne, ker druga dodelitev ne samo doda ~/opt/node/bin, ampak tudi vse predhodno dodeljene PATH.

To je možna rešitev:

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

ampak zaradi berljivosti bi raje imel en cilj na pot.

Če rečeš

PATH=~/opt/bin

to vsi, kaj bo na vaši POTI. PATH je samo spremenljivka okolja in če želite dodati PATH, morate spremenljivko znova zgraditi s točno tisto vsebino, ki jo želite. Torej, kar ste navedli kot primer v vprašanju 2, je točno to, kar želite storiti, razen če popolnoma zgrešim bistvo vprašanja.

V svoji kodi uporabljam obe obliki. Imam splošen profil, ki ga namestim na vsak računalnik, na katerem delam in je videti takole, da se prilagodijo potencialno manjkajočim imenikom:

Izvozi PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # dodaj neobvezne elemente na pot za bindir v $HOME/local/bin $HOME/bin; do if [ -d $bindir ]; nato PATH=$PATH:$(bindir) fi končano

Linux določi pot iskanja izvedljive datoteke iz okolja $PATH. Če želite dodati imenik /data/myscripts na vrh okolja $PATH, uporabite naslednje:

PATH=/data/myscripts:$PATH

Če želite ta imenik dodati na konec poti, uporabite naslednji ukaz:

PATH=$PATH:/data/myscripts

Toda prejšnje niso dovolj, ker ko nastavite spremenljivko okolja znotraj skripta, ta sprememba začne veljati samo znotraj skripta. Ta omejitev je omejena samo na dva načina:

  • Če izvozite spremenljivko okolja v skriptu, velja za vse programe, ki jih kliče skript. Upoštevajte, da to ni učinkovito v programu, imenovanem skript.
  • Če program, ki kliče skript, to stori tako, da vključi namesto klica, vse spremembe okolja skripta veljajo za klicni program. To vključitev lahko izvedete z ukazom pika ali ukazom izvor.

$HOME/myscript.sh vir $HOME/myscript.sh

Vključitev v bistvu vključuje skript za "klicanje" v skript "klic". To je podobno #include v C. Torej je učinkovito znotraj skripta ali klicnega programa. Vendar to seveda ni učinkovito za programe ali skripte, ki jih kliče klicni program. Če želite, da bo učinkovit vse do klicne verige, morate slediti nastavitvi spremenljivke okolja z ukazom za izvoz.

Na primer, lupinski program bash vključuje vsebino datoteke .bash_profile z vključitvijo. Torej, dodajanje naslednjih dveh vrstic v .bash_profile:

PATH=$PATH:/data/myscripts izvoz PATH

učinkovito postavi ti dve vrstici kode v program bash. Tako v spremenljivka bash$PATH vključuje $HOME/myscript.sh in zaradi izvoznega stavka bodo vsi programi, ki jih kliče bash, spremenili $PATH. In ker vse programe, ki se zaženejo iz poziva bash, kliče bash, je nova pot veljavna za vse, kar zaženete iz poziva bash.

Bistvo je, da morate za dodajanje novega imenika na pot dodati ali dodati imenik spremenljivki okolja $PATH v skriptu, vključenem v lupino, in morate izvoziti spremenljivko okolja $PATH.

Dodatne informacije Tukaj

Že nekaj časa imam pri sebi dve funkciji pathadd in pathrm, ki pomagata dodajati elemente na pot, ne da bi morali skrbeti za podvajanja.

pathadd sprejme en argument poti in neobvezen za argumentom, ki bo, če bo dodan, dodan v PATH, sicer ga bo dodal.

V skoraj vsaki situaciji, če dodate pot, boste verjetno želeli preglasiti vse, kar je že na poti, zato raje dodajam privzeto.

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then if [ " $2" = "after" ] ; nato 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 jih v kateri koli skript, za katerega želite spremeniti okolje PATH, in zdaj lahko to storite.

Pot dodaj "/foo/bar" pot dodaj "/baz/bat" po izvozu PATH

Zagotovljeno je, da ne boste dodajali poti, če že obstaja. Če zdaj želite, da je /baz/bat na začetku.

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

Vsako pot je zdaj mogoče postaviti v ospredje, če je že na poti brez podvajanja.

Ne morem govoriti o drugih distribucijah, vendar ima Ubuntu datoteko /etc/environment, ki je standardna iskalna pot za vse uporabnike. Ker svoj računalnik uporabljam samo jaz, na svojo pot postavim poljubne imenike, če je le začasen dodatek, ki ga vstavim v skript.

Tukaj je moja rešitev:

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

Lepa svetla podloga, ki ne pušča sledi:

Pri meni (v Mac OS X 10.9.5) je dodajanje imena poti (npr. /mypathname) v datoteko /etc/paths delovalo zelo dobro.

Pred urejanjem je vrnjen echo $PATH:

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

Po urejanju /etc/paths in ponovnem zagonu lupine se spremenljivka $PATH doda z /pathname. Dejansko echo $PATH vrne:

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

Zgodilo se je, da je bil /mypathname dodan $PATH.

Če želite dodati novo pot okolju PATH PATH:

Izvoz PATH=$PATH:/nova-pot/

Če želite, da ta sprememba velja za vsako lupino, ki jo odprete, jo dodajte v datoteko, ki jo bo lupina poklicala, ko jo pokličete. V različnih lupinah je to lahko:

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

Na primer

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

Navedeno pot lahko vidite v zgornjem izhodu.

Vse datoteke v Linuxu imajo določen naslov v datotečnem sistemu, s katerim lahko do njih dostopamo z uporabo upravitelja datotek ali pripomočkov konzole. To je dokaj preprosta tema, vendar ima veliko začetnikov z njo težave.

V današnjem kratkem članku si bomo ogledali, kakšna je pot do datoteke Linux, kakšna je lahko, kako jo pravilno napisati in še veliko več. Če ste že imeli težave s tem, vam bo po branju članka vse postalo popolnoma jasno.

Poti datotek v Linuxu

Datotečni sistem Linux se zelo razlikuje od sistema Windows. Njegove strukture ne bomo upoštevali, to je bilo storjeno prej. Osredotočili se bomo na delo z datotekami.

Najpomembnejša razlika je v tem, da se naslov datoteke ne začne z pogona, na primer C:\ ali D:\, kot se to zgodi v sistemu Windows, temveč iz korena, korenskega sistemskega imenika, na katerega so povezani vsi ostali. Njegov naslov - /. In tukaj moramo govoriti o naslovih. Poti datotek Linux uporabljajo poševnico "/" za ločevanje imenikov v naslovu, kar se razlikuje od tega, kar ste vajeni videti v sistemu Windows - \.

Na primer, če v Okna polna pot do datoteke na namizju je izgledala kot C:\Users\Sergiy\Desktop\, potem bi bila pot datoteke v Linuxu preprosto /home/sergiy/desktop/. S tem je do zdaj vse preprosto in jasno. Težave pa nastanejo naprej.

V operacijskem sistemu Linux je lahko več vrst poti do datotek. Poglejmo, katere poti obstajajo v Linuxu:

  • Celotna, absolutna pot do Linuxa od korena datotečnega sistema- to pot ste že videli v zgornjem primeru, začne se od korena “/” in opisuje celotno pot do datoteke;
  • Linux relativna pot- to je pot do datoteke glede na trenutno mapo; takšne poti pogosto povzročajo zmedo.
  • Pot glede na domačo mapo trenutnega uporabnika.- pot v datotečnem sistemu, vendar ne iz korena, ampak iz mape trenutnega uporabnika.

Oglejmo si zdaj podrobneje, kako te poti izgledajo v Linuxu, in si poglejmo tudi nekaj primerov, da bo popolnoma jasno. Za predstavitev bomo uporabili pripomoček ls, ki je namenjen pregledovanju vsebine imenikov.

Na primer, v domači mapi imamo takšen imenik s štirimi datotekami:

Takole bo videti celotna pot Linuxa do ene od datotek:

ls /home/sergiy/tmp/file1

To je že relativna pot Linuxa, ki se začne iz domače mape, označena je kot ~/. Opomba, ne ~, namreč ~/. Nato lahko določite podmape, v našem primeru tmp:

No, ali pot datoteke v Linuxu glede na trenutno mapo:

Prva povezava kaže na trenutno mapo (.), druga (..) kaže na višjo mapo. To odpira še večje možnosti za navigacijo po katalogu. Če se na primer sklicujete na datoteko v trenutni mapi, lahko uporabite naslednjo konstrukcijo:

To ni uporabno pri ogledu vsebine datoteke. Je pa zelo pomembno pri izvajanju programa. Ker se bo program najprej iskal v okolju PATH in šele nato v tej mapi. Torej, če morate zagnati program, ki se nahaja v trenutni mapi in se imenuje popolnoma enako kot tisti v imeniku /bin, potem brez izrecne povezave, da morate iskati datoteko v trenutni mapi, nič ne bo delovalo.

Takšni konstrukti se lahko pogosto pojavijo pri prevajanju programov. Vse te simbole in poti datotek linux lahko uporabite ne samo v terminalu, ampak tudi v katerem koli upravitelj datotek, kar je lahko zelo priročno.

Ampak Linux terminal ponuja še večje možnosti. Preproste nadomestne znake lahko uporabite neposredno v naslovih datotek ali imenikov. Na primer, lahko navedete vse datoteke, ki se začnejo z f:

Lahko pa celo iščete ne samo v mapi tmp, ampak v kateri koli podmapi domače mape:

In vse to bo delovalo, morda ni vedno potrebno in praktično. Toda v določenih situacijah lahko zelo pomaga. Te funkcije so implementirane na ravni lupine Bash, tako da jih lahko uporabite v katerem koli ukazu. Lupina pogleda, koliko datotek je bilo najdenih, in za vsako od njih pokliče ukaz.

zaključki

To je vse. Zdaj veste vse, kar potrebujete, da ne samo pravilno napišete pot datoteka linux, ampak izvajajo tudi bolj zapletena dejanja, kot je iskanje datotek ali krmarjenje po imenikih z ukazom cd. Če imate kakršna koli vprašanja, jih vprašajte v komentarjih!

Sorodne objave:


Zanima me, kje naj se doda nova pot spremenljivki okolja PATH. Vem, da je to mogoče doseči z urejanjem .bashrc (na primer), vendar ni jasno, kako to storiti.

Torej:

Izvoz PATH=~/opt/bin:$PATH

Izvoz PATH=$PATH:~/opt/bin

11 odgovorov

Preprost material

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

odvisno od tega, ali želite kodo ~/opt/bin dodati na konec (za iskanje po vseh drugih imenikih, če obstaja program z enakim imenom v več imenikih) ali na začetek (za iskanje pred vsemi drugimi imeniki).

Dodate lahko več vnosov hkrati. PATH=$PATH:~/opt/bin:~/opt/node/bin ali spremembe vrstnega reda so v redu.

Če je spremenljivka že v okolju, vam ni treba izvoziti: vsaka sprememba vrednosti spremenljivke se odraža v okolju.¹ PATH je skoraj vedno v okolju; vsi sistemi unix ga namestijo zelo zgodaj (pravzaprav običajno v prvem procesu).

Če vaš PATH ustvari veliko različnih komponent, lahko na koncu dobite podvojene vnose. Glejte Kako dodati pot v domači imenik, ki jo bo zaznal Unix, kateri ukaz? in Odstranite podvojene vnose $PATH z ukazom awk, da se izognete dvojnikom ali jih odstranite.

Kam postaviti

Upoštevajte, da ~/.bash_rc ne more prebrati noben program, ~/.bashrc pa je konfiguracijska datoteka za interaktivne primerke bash. Ne bi smeli definirati spremenljivk okolja v ~/.bashrc. Pravilno mesto za definiranje spremenljivk okolja, kot je PATH, je ~/.profile (ali ~/.bash_profile, če ne marate lupin, ki niso bash). Glejte Kakšna je razlika med njima in katerega naj uporabim?

Opombe o lupinah, ki niso bash

V bash, ksh in zsh je izvoz posebna sintaksa in tako PATH=~/opt/bin:$PATH kot izvoz PATH=~/opt/bin:$PATH naredita pravo stvar. Na drugih lupinah Bourne/POSIX, kot je dash (ki je v mnogih sistemih /bin/sh), je izvoz razčlenjen kot običajen ukaz, kar pomeni dve razliki:

  • ~ je razčlenjeno samo na začetku besede, razen pri dodelitvah (glejte Kako dodam pot do domačega imenika, ki jo bo zaznal Unix, ki zahteva ukaz? ;
  • $PATH zunanji dvojni narekovaji se prekine, če PATH vsebuje presledke ali \[*? .

Torej v lupinah, kot je dash, izvoz PATH=~/opt/bin:$PATH nastavi PATH na dobesedni niz ~/opt/bin/:, ki mu sledi vrednost PATH do prvega mesta. PATH=~/opt/bin:$PATH (preprosta dodelitev) ne zahteva narekovajev in naredi vse pravilno. Če želite uporabiti izvoz v prenosnem skriptu, morate napisati izvoz PATH="$HOME/opt/bin:$PATH" ali PATH=~/opt/bin:$PATH izvoz PATH (ali PATH=$HOME/opt /bin: $PATH izvoz PATH za prenosljivost tudi v lupino Bourne, ki ne sprejema izvoza var=value in ni izvedla razširitve tilde).

¹ To ni veljalo za Bournove lupine (kot v dejanski Bournovi lupini, ne za sodobne lupine v slogu POSIX), vendar je malo verjetno, da boste dandanes naleteli na tako stare lupine. Pod>

Kakor koli način deluje, vendar ne počnejo iste stvari: elementi PATH se preverjajo od leve proti desni. V prvem primeru bodo imele izvedljive datoteke v ~/opt/bin prednost pred tistimi, ki so nameščene na primer v /usr/bin, kar je lahko ali pa tudi ne tisto, kar želite.

Še posebej je z varnostnega vidika nevarno dodajati poti na sprednjo stran, kajti če nekdo lahko dobi dostop za pisanje v vaš ~/opt/bin, lahko na primer postavi drug ls, ki ga boste verjetno uporabili namesto /bin/ls ne da bi opazil. Zdaj si predstavljajte isto za ssh ali vaš brskalnik ali izbiro ... (Ista stvar je trikrat postavljena na vašo pot.)

Zmeden sem glede vprašanja 2 (saj je bilo odstranjeno iz vprašanja, ker je bilo povezano z ne povezana težava):

Kakšen je učinkovit način za dodajanje dodatnih poti različnim linijam? Sprva sem mislil, da bi to lahko pomagalo:

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

Vendar to ni zato, ker druga dodelitev ne samo doda ~/opt/node/bin, ampak tudi predhodno dodeljeno PATH.

To je možna rešitev:

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

Toda zaradi berljivosti bi raje imel en cilj na pot.

Če rečeš

PATH=~/opt/bin

to vse, ki bo na vaši POTI. PATH je samo spremenljivka okolja in če želite dodati PATH, morate spremenljivko znova zgraditi s točno tisto vsebino, ki jo želite. To pomeni, da je tisto, kar navajate kot primer v vprašanju 2, točno to, kar želite storiti, razen če sem popolnoma zgrešil bistvo vprašanja.

V svoji kodi uporabljam obe obliki. Imam splošen profil, ki ga namestim na vsak računalnik, na katerem delam in je videti takole, za gostovanje potencialno manjkajočih imenikov:

Izvozi PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # dodaj neobvezne elemente na pot za bindir v $HOME/local/bin $HOME/bin; do if [ -d $bindir ]; nato PATH=$PATH:$(bindir) fi končano

Linux definira pot iskanja izvedljive datoteke s spremenljivko okolja $PATH. Če želite dodati imenik /data/myscripts na začetek spremenljivke okolja $PATH, uporabite naslednje:

PATH=/data/myscripts:$PATH

Če želite ta imenik dodati na konec poti, uporabite naslednji ukaz:

PATH=$PATH:/data/myscripts

Toda prejšnje niso dovolj, ker ko nastavite spremenljivko okolja znotraj skripta, ta sprememba začne veljati samo znotraj skripta. Ta omejitev je omejena na dva načina:

  • Če izvozite spremenljivko okolja znotraj skripta, je učinkovita znotraj vseh programov, ki jih kliče skript. Upoštevajte, da to ni učinkovito v programu, ki je poklical skript.
  • Če program, ki kliče skript, to stori tako, da vključi namesto klica, vse spremembe okolja skripta veljajo za klicni program. To vključitev lahko izvedete z ukazom pika ali ukazom izvor.

$HOME/myscript.sh vir $HOME/myscript.sh

Vključitev v bistvu vključuje skript za "klicanje" v skript "klic". To je podobno #include v C. Torej je učinkovito znotraj skripta ali klicnega programa. Vendar to seveda ni učinkovito za programe ali skripte, ki jih kliče klicni program. Če želite, da bo učinkovit vse do klicne verige, morate slediti nastavitvi spremenljivke okolja z ukazom za izvoz.

Na primer, lupinski program bash vključuje vsebino datoteke .bash_profile z vključitvijo. Torej vstavite naslednji 2 vrstici v .bash_profile:

PATH=$PATH:/data/myscripts izvoz PATH

učinkovito postavi ti dve vrstici kode v program bash. Torej v bashu spremenljivka $PATH vključuje $HOME/myscript.sh in zaradi izjave o izvozu imajo vsi programi, ki jih kliče bash, spremenljivko $PATH spremenjeno. In ker vse programe, ki jih zaženete iz poziva bash, kliče bash, nova pot velja za vse, kar zaženete iz poziva bash.

Bistvo je, da morate za dodajanje novega imenika na pot dodati ali dodati imenik k spremenljivki okolja $PATH v skriptu, vključenem v lupino, in morate izvoziti spremenljivko okolja $PATH.

Že nekaj časa imam pri sebi dve funkciji pathadd in pathrm, ki pomagata dodajati elemente na pot, ne da bi me skrbelo podvajanje.

pathadd sprejme en argument poti in neobvezen za argumentom, ki bo, če bo dodan, dodan v PATH, sicer ga bo dodal.

V vsakem primeru, če dodajate pot, boste verjetno želeli preglasiti vse, kar je že na poti, zato raje dodajam privzeto.

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then if [ " $2" = "after" ] ; nato 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 jih v kateri koli skript, za katerega želite spremeniti okolje PATH, in končali ste.

Pot dodaj "/foo/bar" pot dodaj "/baz/bat" po izvozu PATH

Zagotovljeno je, da ne boste dodali poti, če že obstaja. Če želite, da se najprej zažene /baz/bat.

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

Vsako pot je zdaj mogoče premakniti naprej, če je že na poti brez podvajanja.

Neprebojni dodatek/metoda predpriprave

Pri izbiri dodajanja in dodajanja je treba upoštevati veliko premislekov. Mnogi od njih so zajeti v drugih odgovorih, zato jih tukaj ne bom ponavljal.

Pomembno je, da tudi če sistemski skripti tega ne uporabljajo (sprašujem se, zakaj) *1, je to neprebojen način za dodajanje poti (npr. $HOME/bin) spremenljivki okolja PATH

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

dodati (namesto PATH="$PATH:$HOME/bin") in

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

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

S tem se izognete napačnemu uvodnemu/končnemu dvopičju, ko je $PATH na začetku prazen, kar ima lahko neželene stranske učinke in je lahko prava nočna mora (ta odgovor na kratko obravnava primer awk -way).

$(parameter:+beseda)

Če je parameter nič ali ni nastavljen, se nič ne zamenja, sicer se zamenja beseda beseda.

Torej se $(PATH:+$(PATH):) razširi na: 1) nič, če je PATH nič ali ni nastavljen, 2) $(PATH): če je PATH nastavljen.

Opomba. To je za bash.

*1 Pravkar sem ugotovil, da skripti, kot je devtoolset-6/enable, uporabljajo to, $ cat /opt/rh/devtoolset-6/enable # Splošne spremenljivke okolja izvoz PATH=/opt/rh/devtoolset-6/root/usr /bin $(PATH:+:$(PATH)) ...

Ne morem govoriti o drugih distribucijah, vendar ima Ubuntu datoteko /etc/environment, ki je privzeta iskalna pot za vse uporabnike. Ker svoj računalnik uporabljam samo jaz, tja na svojo pot vstavim poljubne imenike, razen če gre za začasen dodatek, ki ga vstavim v skript.

Pri meni (v Mac OS X 10.9.5) je dodajanje imena poti (npr. /mypathname) v datoteko /etc/paths delovalo zelo dobro.

Pred urejanjem je vrnjen echo $PATH:

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

Po urejanju /etc/paths in ponovnem zagonu lupine se spremenljivka $PATH doda z /pathname. Dejansko echo $PATH vrne:

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

Zgodilo se je, da je bil /mypathname dodan spremenljivki $PATH.