Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Variabli i mjedisit PATH. Variabli i mjedisit PATH Variabli i rrugës në linux

Kur futni një komandë në vijën e komandës, në thelb po i thoni shell-it të ekzekutojë një skedar të ekzekutueshëm me emrin e dhënë. Në Linux, këto programe të ekzekutueshme si ls, find, file dhe të tjera priren të jetojnë në disa drejtori të ndryshme në sistemin tuaj. Çdo skedar me leje të ekzekutueshme të ruajtura në këto drejtori mund të ekzekutohet nga kudo. Drejtoritë më të zakonshme që përmbajnë programe të ekzekutueshme janë /bin, /sbin, /usr/sbin, /usr/local/bin dhe /usr/local/sbin.

Por si e di shell-i se cilat direktori duhet të kërkojë programe të ekzekutueshme apo e kërkon shell të gjithë sistemin e skedarëve?

Përgjigja është e thjeshtë. Kur lëshoni një komandë, guaska kërkon të gjitha drejtoritë e specifikuara në ndryshoren $PATH të përdoruesit për një skedar të ekzekutueshëm me atë emër.

Ky artikull ju tregon se si të shtoni direktori në variablin $PATH të sistemit tuaj.

Çfarë është $PATH në Linux

Ndryshorja e mjedisit $PATH është një listë e kolonizuar e drejtorive që i tregon shell se cilat drejtori të kërkojnë për skedarë të ekzekutueshëm.

Për të kontrolluar se cilat drejtori keni në ndryshoren tuaj $PATH, mund të përdorni komandën printenv ose echo:

Jehon $PATH

Prodhimi do të duket diçka si kjo:

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

Nëse keni dy skedarë të ekzekutueshëm me të njëjtin emër të vendosur në dy drejtori të ndryshme, guaska do të ekzekutojë skedarin që është në drejtorinë që vjen i pari në $PATH.

Shtimi i një drejtorie në $PATH tuaj

Ka situata ku mund të dëshironi të shtoni direktori të tjera në ndryshoren tuaj $PATH. Për shembull, disa programe mund të instalohen në vende të ndryshme, ose mund të dëshironi të keni një direktori të dedikuar për hyrjet tuaja personale, por të jeni në gjendje t'i ekzekutoni ato pa specifikuar shtegun absolut drejt ekzekutuesve. Për ta bërë këtë, ju vetëm duhet të shtoni drejtorinë në $PATH tuaj.

Le të themi se keni një drejtori të quajtur bin e vendosur në direktorinë tuaj kryesore në të cilën ruani skriptet e guaskës. Për të shtuar një drejtori në ndryshoren tuaj $PATH:

Komanda e eksportit eksporton variablin e modifikuar në mjediset fëmijë të proceseve të guaskës.

Tani mund të ekzekutoni skriptet tuaja thjesht duke shtypur emrin e skriptit të ekzekutueshëm pa specifikuar shtegun e plotë drejt skedarit të ekzekutueshëm.

Megjithatë, ky ndryshim është i përkohshëm dhe ndikon vetëm në sesionin aktual të guaskës.

Për ta bërë ndryshimin të përhershëm, duhet të përcaktoni një variabël $PATH në skedarët e konfigurimit të guaskës. Në shumicën e shpërndarjeve Linux, kur filloni një sesion të ri, variablat e mjedisit lexohen nga skedarët e mëposhtëm:

  • Skedarët e konfigurimit global të guaskës si /etc/environment dhe /etc/profile. Përdoreni këtë skedar nëse dëshironi që një direktori e re të shtohet në $PATH të të gjithë përdoruesve të sistemit.
  • Skedarët e konfigurimit për predha individuale të përdoruesve. Për shembull, nëse jeni duke përdorur Bash, mund të vendosni variablin $PATH në skedarin ~/.bashrc dhe nëse përdorni Zsh, emri i skedarit është ~/.zshrc.

Në këtë shembull, ne do të vendosim një variabël në skedarin ~/.bashrc. Hapni skedarin në një redaktues teksti dhe shtoni rreshtin e mëposhtëm në fund:

Nano ~/.bashrc

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

Ruani skedarin dhe ngarkoni vlerën e re $PATH në sesionin aktual të guaskës duke përdorur:

Burimi ~/.bashrc

Për të konfirmuar që drejtoria është shtuar me sukses, printoni vlerën e saj $PATH duke shtypur:

Jehon $PATH

konkluzioni

Shtimi i drejtorive të reja te përdoruesi juaj ose te $PATH globale është mjaft i thjeshtë. Kjo ju lejon të ekzekutoni komandat dhe skriptet e ruajtura në vende jo standarde pa pasur nevojë të futni shtegun e plotë drejt ekzekutuesit.

Të njëjtat udhëzime zbatohen për çdo shpërndarje Linux, duke përfshirë CentOS, RHEL, Debian dhe Linux Mint.

Mos ngurroni të lini një koment nëse keni ndonjë pyetje.

Cfare eshte? Shumë nga komandat që futni në vijën e komandës kërkojnë përdorimin e një programi të jashtëm që ngarkohet nga sistemi i skedarëve. Për shembull, komandat si mkdir dhe wc ndodhen në dosjen /bin.

Kur futni një instruksion që guaska Bash nuk e njeh, ajo përpiqet ta ekzekutojë si program dhe kthen një gabim nëse nuk gjen një program me atë emër. Dhe kjo vlen jo vetëm për komandat themelore që shikuam, sepse nga linja e komandës mund të ekzekutoni çdo program.


Por si, nëse është i pranishëm në sistemin e skedarëve, Linux e di se cilat programe duhet të ekzekutohen nga cilat drejtori? Sistemi operativ përdor një ndryshore të mjedisit të sistemit për të specifikuar një nëngrup dosjesh për të kërkuar kur merr një komandë të panjohur. Kjo variabël quhet PATH dhe mund të shfaqet me komandën e mëposhtme echo (kërkohet simboli $):

Jehon $PATH

Dalja e kësaj komande do të duket si shtatë shtigjet e mëposhtme të dosjeve absolute, të ndara me dy pika:

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

Sa herë që futni një komandë të panjohur, Linux do të shikojë në secilën prej dosjeve të specifikuara në variablin e mjedisit sipas renditjes që janë specifikuar, duke u përpjekur të gjejë një program me të njëjtin emër. Nëse programi gjendet, ai funksionon; përndryshe shfaqet një mesazh gabimi. Por nuk do të jetë gabim nëse blini unazat tuaja të dashura prej argjendi si dhuratë. Argjendi do të dekoroj çdo grua!

Këto shtatë dosje ofrojnë qasje të lehtë në të gjitha programet kryesore në sistemin operativ, duke përfshirë . Çdo program jashtë këtyre shtatë dosjeve nuk mund të niset thjesht duke shtypur emrin e tyre në vijën e komandës.

Për shembull, keni shkarkuar programin e ditarit nga Interneti në dosjen tuaj të shtëpisë. Nëse futni emrin e tij në vijën e komandës, do të merrni një mesazh gabimi sepse është në një dosje që nuk përfshihet në shtegun e sistemit. Për të ekzekutuar këtë program, futni rreshtin e mëposhtëm (mos harroni, simboli ~ është stenografi për dosjen tuaj kryesore):

Nëse e keni ruajtur në një dosje jashtë shtegut tuaj të specifikuar, do t'ju duhet të vendosni shtegun absolut dhe emrin e skedarit për të ekzekutuar programin.

Natyrisht, supozohet se ditari është një program i thjeshtë i pavarur që nuk kërkon instalim, sepse shumica e aplikacioneve kryesore do ta vendosin skedarin e ekzekutueshëm të programit diku në rrugën tuaj të specifikuar gjatë procesit të instalimit. Si kjo Variabli i mjedisit PATH, shijojeni për shëndetin tuaj!

Po pyes veten se ku duhet shtuar shtegu i ri në variablin e mjedisit PATH. E di që kjo mund të arrihet duke redaktuar .bashrc (për shembull), por nuk është e qartë se si ta bëjmë këtë.

Kështu:

Eksporto PATH=~/opt/bin:$PATH

Eksporto PATH=$PATH:~/opt/bin

11 përgjigje

Material i thjeshtë

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

në varësi të faktit nëse dëshironi të shtoni kodin ~/opt/bin në fund (për të kërkuar të gjitha drejtoritë e tjera nëse ka një program me të njëjtin emër në shumë drejtori) ose në fillim (për të kërkuar para të gjitha drejtorive të tjera).

Mund të shtoni shumë hyrje në të njëjtën kohë. PATH=$PATH:~/opt/bin:~/opt/node/bin ose ndryshimet në renditjen janë të mira.

Nuk keni nevojë të eksportoni nëse ndryshorja është tashmë në mjedis: çdo ndryshim në vlerën e ndryshores reflektohet në mjedis.¹ PATH është pothuajse gjithmonë në mjedis; të gjitha sistemet unix e instalojnë atë shumë herët (zakonisht në procesin e parë, në fakt).

Nëse PATH juaj është krijuar nga shumë komponentë të ndryshëm, mund të përfundoni me hyrje të dyfishta. Shihni Si të shtoni një shteg në drejtorinë tuaj të shtëpisë që do të zbulohet nga Unix, cila komandë? dhe Hiq hyrjet e dyfishta të $PATH duke përdorur komandën awk për të shmangur dublikatat ose për t'i hequr ato.

Ku të vendosni

Vini re se ~/.bash_rc nuk lexohet nga asnjë program dhe ~/.bashrc është skedari i konfigurimit për instancat interaktive të bash-it. Ju nuk duhet të përcaktoni variablat e mjedisit në ~/.bashrc. Vendi i duhur për të përcaktuar variablat e mjedisit si PATH është ~/.profile (ose ~/.bash_profile nëse nuk ju pëlqejnë predha të tjera përveç bash). Shihni Cili është ndryshimi midis tyre dhe cilin duhet të përdor?

Shënime për predha jo bash

Në bash, ksh dhe zsh, eksporti është një sintaksë e veçantë dhe si PATH=~/opt/bin:$PATH ashtu edhe eksporti PATH=~/opt/bin:$PATH bëjnë gjënë e duhur madje. Në predha të tjera Bourne/POSIX, të tilla si dash (që është /bin/sh në shumë sisteme), eksporti analizohet si një komandë normale, që nënkupton dy dallime:

  • ~ analizohet vetëm në fillim të një fjale, përveç në detyrat (shihni Si të shtoj një shteg të drejtorisë kryesore që do të zbulohet nga Unix që kërkon komandën? ;
  • Thomat e dyfishta të jashtme $PATH prishen nëse PATH përmban hapësira apo \[*? .

Pra, në predha si dash, eksportoni PATH=~/opt/bin:$PATH e vendos PATH në vargun literal ~/opt/bin/: e ndjekur nga vlera PATH deri në vendin e parë. PATH=~/opt/bin:$PATH (caktim i thjeshtë) nuk kërkon thonjëza dhe bën gjithçka siç duhet. Nëse dëshironi të përdorni eksportin në një skript portativ, duhet të shkruani eksport PATH="$HOME/opt/bin:$PATH" ose PATH=~/opt/bin:$PATH eksport PATH (ose PATH=$HOME/opt /bin: $PATH eksporton PATH për transportueshmëri edhe në guaskën Bourne, e cila nuk pranon eksport var=vlerë dhe nuk ka bërë zgjerim tilde).

¹ Kjo nuk ishte e vërtetë në predhat Bourne (si në guaskën aktuale të Bourne, jo predha moderne të stilit POSIX), por nuk ka gjasa të hasni predha kaq të vjetra këto ditë. Nën>

Sido që të jetë funksionon, por ata nuk bëjnë të njëjtën gjë: elementët PATH kontrollohen nga e majta në të djathtë. Në shembullin e parë, ekzekutuesit në ~/opt/bin do të kenë përparësi ndaj atyre të instaluar, për shembull, në /usr/bin, të cilat mund të jenë ose jo ato që dëshironi.

Në veçanti, nga pikëpamja e sigurisë është e rrezikshme të shtosh shtigje në pjesën e përparme, sepse nëse dikush mund të ketë akses shkrimi në ~/opt/bin , ai mund të vendosë një ls tjetër për shembull, të cilin ndoshta do ta përdorni në vend të tyre /bin/ls pa vënë re. Tani imagjinoni të njëjtën gjë për ssh ose shfletuesin ose zgjedhjen tuaj... (E njëjta gjë vihet tre herë në rrugën tuaj.)

Jam i hutuar për pyetjen 2 (pasi u hoq nga pyetja sepse lidhej me një çështje pa lidhje):

Cila është një mënyrë efikase për të shtuar shtigje shtesë në linja të ndryshme? Fillimisht mendova se kjo mund të bëjë mashtrimin:

Eksporto PATH=$PATH:~/opt/bin eksport PATH=$PATH:~/opt/node/bin

Por kjo nuk ndodh sepse caktimi i dytë jo vetëm që shton ~/opt/node/bin, por edhe PATH të caktuar më parë.

Ky është një zgjidhje e mundshme:

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

Por për lexueshmëri më mirë do të kisha një destinacion për shteg.

Nëse thua

PATH=~/opt/bin

Kjo të gjitha, e cila do të jetë në RRUGËN tuaj. PATH është thjesht një variabël mjedisi, dhe nëse doni të shtoni te PATH, duhet të rindërtoni variablin me saktësisht përmbajtjen që dëshironi. Kjo do të thotë, ajo që ju jepni si shembull në pyetjen 2 është pikërisht ajo që dëshironi të bëni, përveç nëse e kam humbur plotësisht pikën e pyetjes.

Unë përdor të dy format në kodin tim. Unë kam një profil të përgjithshëm që e instaloj në çdo makinë në të cilën punoj që duket kështu, për të pritur drejtoritë që mund të mungojnë:

Eksporto PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # shtoni artikuj opsional në shtegun për bindir në $HOME/lokal/koshi $HOME/koshi; bëj nëse [ -d $bindir ]; pastaj PATH=$PATH:$(bindir) fi bërë

Linux përcakton rrugën e kërkimit të ekzekutueshëm me variablin e mjedisit $PATH. Për të shtuar drejtorinë /data/myscripts në fillim të ndryshores së mjedisit $PATH, përdorni sa vijon:

PATH=/data/myscripts:$PATH

Për të shtuar këtë direktori në fund të shtegut, përdorni komandën e mëposhtme:

PATH=$PATH:/data/myscripts

Por ato të mëparshmet nuk mjaftojnë sepse kur vendosni një variabël mjedisi brenda një skripti, ai ndryshim hyn në fuqi vetëm brenda skriptit. Ky kufizim kufizohet në dy mënyra:

  • Nëse eksportoni një variabël mjedisi brenda një skripti, ai është efektiv brenda çdo programi të thirrur nga skripti. Vini re se kjo nuk është efektive në programin që thirri skriptin.
  • Nëse programi që thërret skriptin e bën këtë duke përfshirë në vend të thirrjes, çdo ndryshim i mjedisit në skript është efektiv në programin thirrës. Ky përfshirje mund të bëhet duke përdorur komandën dot ose komandën burim.

$HOME/myscript.sh burimi $HOME/myscript.sh

Përfshirja në thelb përfshin skriptin "të thirrshëm" në skriptin "thirrje". Kjo është e ngjashme me #include në C. Pra, është efektive brenda një skripti ose programi telefonues. Por sigurisht kjo nuk është efektive për asnjë program ose skript të thirrur nga programi thirrës. Për ta bërë atë efektiv deri në zinxhirin e thirrjeve, duhet të ndiqni cilësimin e ndryshores së mjedisit duke përdorur komandën e eksportit.

Si shembull, programi bash shell përfshin përmbajtjen e skedarit .bash_profile duke përfshirë. Pra, vendosni 2 rreshtat e mëposhtëm në .bash_profile:

PATH=$PATH:/data/myscripts eksportoni PATH

i vendos në mënyrë efektive ato 2 rreshta kodi në një program bash. Pra, në bash, ndryshorja $PATH përfshin $HOME/myscript.sh, dhe për shkak të deklaratës së eksportit, çdo program i thirrur nga bash ka ndryshuar variablin $PATH. Dhe meqenëse çdo program që nisni nga kërkesa bash thirret nga bash, shtegu i ri zbatohet për çdo gjë që nisni nga kërkesa bash.

Në fund të fundit është se për të shtuar një direktori të re në shteg, duhet të shtosh ose shtosh direktorinë në ndryshoren e mjedisit $PATH në një skript të përfshirë në guaskë dhe duhet të eksportosh variablin e mjedisit $PATH.

Unë kam mbajtur me vete për disa kohë dy funksione pathadd dhe pathrm që ndihmojnë në shtimin e elementeve në një shteg pa u shqetësuar për dublikimet.

pathadd merr një argument shteg dhe një argument opsional pas, i cili nëse shtohet do të shtohet në PATH, përndryshe do ta shtojë atë.

Në çdo situatë, nëse jeni duke shtuar një shteg, ndoshta dëshironi të anashkaloni çdo gjë që është tashmë në rrugë, kështu që unë preferoj të shtoj si parazgjedhje.

Pathadd() ( newelement=$(1%/) nëse [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; atëherë nëse [ " $2" = "pas" ] ; pastaj 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")" )

Vendosini ato në çfarëdo skripti që dëshironi për të ndryshuar mjedisin PATH dhe tani keni mbaruar.

Pathadd "/foo/bar" pathadd "/baz/bat" pas eksportit PATH

Jeni të garantuar të mos shtoni një shteg nëse tashmë ekziston. Nëse dëshironi që /baz/bat të ekzekutohet së pari.

Pathrm "/baz/bat" pathadd "/baz/bat" eksportoni PATH

Çdo rrugë tani mund të zhvendoset në pjesën e përparme nëse është tashmë në një shteg pa dyfishim.

Metoda e shtimit/përgatitjes antiplumb

Ka shumë konsiderata të përfshira në zgjedhjen për të shtuar dhe shtuar. Shumë prej tyre janë përfshirë në përgjigje të tjera, ndaj nuk do t'i përsëris këtu.

Pika e rëndësishme është se edhe nëse skriptet e sistemit nuk e përdorin këtë (pyes veten pse) *1, është një mënyrë antiplumb për të shtuar një shteg (p.sh. $HOME/bin) në ndryshoren e mjedisit PATH

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

për të shtuar (në vend të PATH="$PATH:$HOME/bin") dhe

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

për të shtuar (në vend të PATH="$HOME/bin:$PATH")

Kjo shmang një dy pika kryesore të rreme/pasuese kur $PATH është fillimisht bosh, gjë që mund të ketë efekte anësore të padëshiruara dhe mund të jetë një makth për t'u gjetur (kjo përgjigje trajton shkurtimisht rastin awk-way).

$(parametër:+fjalë)

Nëse parametri është i pavlefshëm ose i pacaktuar, asgjë nuk zëvendësohet, përndryshe fjala zëvendësohet.

Pra, $(PATH:+$(PATH):) zgjerohet në: 1) asgjë nëse PATH është i pavlefshëm ose i pacaktuar, 2) $(PATH): nëse PATH është vendosur.

shënim. Kjo është për bash.

*1 Sapo zbulova se skriptet si devtoolset-6/enable e përdorin këtë, $ cat /opt/rh/devtoolset-6/enable # Variabla të përgjithshme të mjedisit eksportojnë PATH=/opt/rh/devtoolset-6/root/usr /bin $(PATH:+:$(PATH)) ...

Nuk mund të flas për shpërndarje të tjera, por Ubuntu ka një skedar, /etc/environment, që është rruga e paracaktuar e kërkimit për të gjithë përdoruesit. Meqenëse kompjuteri im përdoret vetëm nga unë, vendos në rrugën time çfarëdo drejtorie që dua, përveç nëse është një shtesë e përkohshme që vendos në skenar.

Për mua (në Mac OS X 10.9.5) shtimi i emrit të shtegut (p.sh. /mypathname) në skedarin /etc/paths funksionoi shumë mirë.

Përpara modifikimit, kthehet echo $PATH:

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

Pas redaktimit të /etc/paths dhe rinisjes së guaskës, ndryshorja $PATH shtohet me /pathname . Në të vërtetë, kthen jehonë $PATH:

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

Ajo që ndodhi ishte se /mypathname iu shtua variablit $PATH.

Variablat e mjedisit ( variabli i mjedisit) përdoren për të ruajtur vlerat e zakonshme të variablave nëpër skripta dhe programe të ndryshme. Variabla të tillë mund të vendosen për një kohë, për shembull, për periudhën e funksionimit të një predhe të caktuar terminali, ose për periudhën e një sesioni të përdoruesit, ose mund të vendosni një ndryshore mjedisore në nivel global - për të gjithë sistemin.

Variablat e Mjedisit

$HOME
Ndryshorja përmban shtegun për në direktorinë kryesore të përdoruesit aktual. USER $
Emri aktual i përdoruesit $PATH
Lista e drejtorive për shell për të kërkuar programe të ekzekutueshme. $PWD
Rruga drejt drejtorisë aktuale të punës (ose pwd). Shembull: dir_path=$(pwd) . $SHELL
Përkthyesi i parazgjedhur $RANDOM
Gjeneron një numër të rastësishëm 0..32767 sa herë që aksesohet një ndryshore. $SECONDS
Koha në sek. nga momenti kur filloni guaskën e komandës. $? Rezultati i komandës së mëparshme. $HOSTNAME
Emri i kompjuterit $HISTFILE
Rruga drejt skedarit të historisë së interpretuesit $IFS
Lista e karaktereve ndarës të komandave, parametrave, elementeve të grupit (parazgjedhja: hapësira, skeda, rreshti i ri) $PS1
Modeli i vargut të kërkesës së interpretuesit.

Vendosja e përkohshme e një ndryshoreje mjedisi

Vendosja e një ndryshoreje mjedisi për periudhën e sesionit:

# Për një proces të ri env varname=value [command] # Për shell aktual dhe të gjitha nënproceset e tij eksportoni varname=value [command]

Vlera e ndryshores ruhet derisa sistemi të rindizet.

Vendosja e një vlere konstante

Variablat e mjedisit të nivelit të sistemit vendosen përmes skedarit /etc/environment:

MJEDISI = "dev"

Vendosja e një ndryshoreje mjedisi specifike të përdoruesit nëpërmjet skedarit ~/.bashrc ose ~/.bash_profile:

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

Kujdes!

Skedari ~/.bash_profile do të ekzekutohet kur interpretuesi të fillojë me çelësin -l. Ky skedar nuk mund të lexohet kur regjistroheni në nivel lokal!

Ju gjithashtu duhet të mbani mend se ndryshimet do të hyjnë në fuqi vetëm pas rinisjes së seancës!

Shikimi i vlerës së një ndryshoreje mjedisi

Për të parë vlerën e një ndryshoreje mjedisi, ekziston komanda printenv:

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

#guaskë, #bash, #mjedis

Artikujt më të mirë mbi këtë temë