Cesta pre Linux, ako zadať cesty k priečinkom. premenná prostredia PATH. Pridanie premenných používateľského a systémového prostredia v systéme Linux

Keď zadáte príkaz v príkazový riadok, v podstate hovoríte shellu, aby spustil spustiteľný súbor s daným názvom. Na Linuxe tieto spustiteľné programy, ako ls, find, file a iné majú tendenciu žiť v niekoľkých rôznych adresároch vo vašom systéme. Akýkoľvek súbor s oprávneniami na spustenie uložené v týchto adresároch je možné spustiť odkiaľkoľvek. Najbežnejšie adresáre, ktoré obsahujú spustiteľné programy, sú /bin, /sbin, /usr/sbin, /usr/local/bin a /usr/local/sbin.

Ale ako shell vie, ktoré adresáre má hľadať spustiteľné programy, alebo ako shell prehľadáva všetky systém súborov?

Odpoveď je jednoduchá. Keď zadáte príkaz, shell vyhľadá všetky adresáre špecifikované v užívateľskej premennej $PATH a nájde spustiteľný súbor s týmto názvom.

Tento článok vám ukáže, ako pridať adresáre do systémovej premennej $PATH.

Čo je $PATH v Linuxe

Premenná prostredia $PATH je dvojbodkou kolonizovaný zoznam adresárov, ktorý hovorí shellu, ktoré adresáre má hľadať spustiteľné súbory.

Ak chcete skontrolovať, ktoré adresáre máte vo svojej premennej $PATH, môžete použiť príkaz printenv alebo echo:

Echo $PATH

Výstup bude vyzerať asi takto:

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

Ak máte dva spustiteľné súbory s rovnakým názvom umiestnené v dvoch rôznych adresároch, shell spustí súbor, ktorý je v adresári, ktorý je na prvom mieste v $PATH.

Pridanie adresára do vašej $PATH

Existujú situácie, keď možno budete chcieť pridať ďalšie adresáre do premennej $PATH. Niektoré programy môžu byť napríklad nainštalované na rôznych miestach, alebo možno budete chcieť mať vyhradený adresár pre svoje osobné položky, ale budete ich môcť spúšťať bez zadania absolútnej cesty k spustiteľným súborom. Ak to chcete urobiť, stačí pridať adresár do vašej $PATH.

Povedzme, že máte vo svojom domovskom adresári adresár s názvom bin, do ktorého ukladáte skripty shellu. Ak chcete pridať adresár do premennej $PATH:

Príkaz export exportuje upravenú premennú do podradených prostredí procesov shellu.

Teraz môžete spustiť svoje skripty jednoduchým zadaním názvu spustiteľného skriptu bez zadania úplnej cesty k spustiteľnému súboru.

Táto zmena je však dočasná a ovplyvňuje iba aktuálnu reláciu shellu.

Aby bola zmena trvalá, musíte definovať premennú $PATH v konfiguračných súboroch shellu. Vo väčšine distribúcií Linuxu sa pri spustení novej relácie čítajú premenné prostredia z nasledujúcich súborov:

  • Globálne konfiguračné súbory shellu, ako napríklad /etc/environment a /etc/profile. Tento súbor použite, ak chcete, aby bol nový adresár pridaný všetkým používateľov systému$PATH.
  • Konfiguračné súbory pre jednotlivé používateľské shelly. Napríklad, ak používate Bash, môžete nastaviť premennú $PATH v súbore ~/.bashrc a ak používate Zsh, názov súboru je ~/.zshrc.

V tomto príklade nastavíme premennú v súbore ~/.bashrc. Otvorte súbor v textový editor a na koniec pridajte nasledujúci riadok:

Nano ~/.bashrc

Exportovať PATH="$HOME/bin:$PATH"

Uložte súbor a načítajte novú hodnotu $PATH do aktuálnej relácie shellu pomocou:

Zdroj ~/.bashrc

Ak chcete potvrdiť, že bol adresár úspešne pridaný, vytlačte jeho hodnotu $PATH zadaním:

Echo $PATH

Záver

Pridanie nových adresárov do vašej používateľskej alebo globálnej $PATH je celkom jednoduché. To vám umožní spúšťať príkazy a skripty uložené na neštandardných miestach bez toho, aby ste museli zadávať úplnú cestu k spustiteľnému súboru.

Rovnaké pokyny platia pre všetky Linuxová distribúcia vrátane , CentOS, RHEL, Debian a Linux Mint.

Ak máte nejaké otázky, pokojne zanechajte komentár.

Čo to je? Mnohé z príkazov, ktoré zadávate v príkazovom riadku, vyžadujú použitie externého programu, ktorý sa načítava zo systému súborov. Napríklad príkazy ako mkdir a wc sa v skutočnosti nachádzajú v priečinku /bin.

Keď zadáte inštrukciu, ktorú shell Bash nepozná, pokúsi sa ju vykonať ako program a vráti chybu, ak nenájde program s týmto názvom. A to platí nielen pre základné príkazy, na ktoré sme sa pozreli, pretože z príkazového riadku môžete spustiť akýkoľvek program.


Ale ako, ak existuje súbor Linuxový systém vie, ktoré programy spustiť z ktorých adresárov? OS používa systémovú premennú prostredia na určenie podmnožiny priečinkov, ktoré sa majú vyhľadať pri prijatí neznámeho príkazu. Táto premenná sa nazýva PATH a možno ju zobraziť pomocou nasledujúceho príkazu echo (vyžaduje sa symbol $):

Echo $PATH

Výstup tohto príkazu bude vyzerať ako nasledujúcich sedem absolútnych ciest k priečinkom oddelených dvojbodkami:

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

Zakaždým, keď zadáte neznáme Linuxové príkazy prehľadá každý z priečinkov zadaných v premennej prostredia v poradí, v akom boli zadané, a pokúsi sa nájsť program s rovnakým názvom. Ak sa program nájde, spustí sa; inak sa zobrazí chybové hlásenie. Nebude však chybou, ak svoje milované strieborné prstene kúpite ako darček. Striebro ozdobí každú ženu!

Týchto sedem priečinkov poskytuje ľahký prístup do všetkých hlavných programov v operačný systém, počítajúc do toho . Akékoľvek programy mimo týchto siedmich priečinkov nemožno spustiť jednoduchým zadaním ich názvu do príkazového riadku.

Napríklad ste si stiahli utilitu denníka z internetu do svojho domovského priečinka. Ak do príkazového riadka zadáte jeho názov, zobrazí sa chybové hlásenie, pretože sa nachádza v priečinku, ktorý nie je zahrnutý v systémovej ceste. Ak chcete spustiť tento program, zadajte nasledujúci riadok (pamätajte, že symbol ~ je skratka pre váš domovský priečinok):

Ak ste ho uložili do priečinka mimo zadanej cesty, budete musieť zadať absolútnu cestu a názov súboru, aby ste spustili nástroj.

Samozrejme, predpokladá sa, že diár je jednoduchý samostatný program, ktorý nevyžaduje inštaláciu, pretože väčšina hlavných aplikácií umiestni spustiteľný súbor programu niekam do zadanej cesty počas procesu inštalácie. Páči sa ti to premenná prostredia PATH, užite si to pre svoje zdravie!

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

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

9 riešení zhromažďuje webový formulár pre „Ako správne pridať cestu do PATH?“

Jednoduché veci

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

v závislosti od toho, či chcete pridať ~/opt/bin na koniec (pre vyhľadávanie všetkých ostatných adresárov, ak je program s rovnakým názvom vo viacerých adresároch) alebo na začiatok (pre vyhľadávanie pred všetkými ostatnými adresármi).

Môžete pridať viacero záznamov súčasne. PATH=$PATH:~/opt/bin:~/opt/node/bin alebo zmeny v poradí sú v poriadku.

Nemusíte exportovať, ak sa premenná už nachádza v prostredí: každá zmena hodnoty premennej sa prejaví v prostredí PATH je takmer vždy v prostredí; Všetky unixové systémy nainštalujte ho veľmi skoro (v skutočnosti zvyčajne v prvom procese).

Ak je vaša PATH postavená v rôznych komponentoch, môžete skončiť s duplicitnými položkami. Pozrite si časť Ako pridať cestu do zdrojového adresára, ktorý má Unix zistiť, aký je príkaz? a odstráňte duplicitné položky $PATH pomocou príkazu awk, aby ste sa vyhli pridávaniu alebo odstráneniu duplikátov.

Kam dať

Všimnite si, že ~/.bash_rc nie je čitateľný žiadnym programom a ~/.bashrc je konfiguračný súbor pre interaktívne inštancie bash. V ~/.bashrc by ste nemali definovať premenné prostredia. Správne miesto na definovanie premenných prostredia, ako je PATH, je ~/.profile (alebo ~/.bash_profile, ak nepotrebujete nebash shelly). Pozrite sa, aký je medzi nimi rozdiel a ktorý z nich by som mal použiť?

Poznámky k shellom bez bash

V bash, ksh a zsh je export špeciálnou syntaxou a PATH=~/opt/bin:$PATH aj export PATH=~/opt/bin:$PATH robia všetko správne. Na iných shelloch Bourne/POSIX, ako je napríklad dash (čo je /bin/sh na mnohých systémoch), sa export analyzuje ako normálny príkaz, čo znamená dva rozdiely:

  • ~ sa analyzuje iba na začiatku slova, s výnimkou priradení (pozri časť "Ako pridať cestu k zdrojovému adresáru, ktorý bude detekovaný Unixom, aký príkaz?").
  • $PATH mimo dvojitých úvodzoviek sa zalomí, ak PATH obsahuje medzery alebo \[*? ,

Takže v shelloch podobných pomlčkám export PATH=~/opt/bin:$PATH nastaví PATH na doslovný reťazec ~/opt/bin/: nasledovaný hodnotou PATH až na prvé miesto. PATH=~/opt/bin:$PATH (fuzzy priradenie) nevyžaduje úvodzovky a robí správnu vec. Ak chcete použiť export v prenosnom skripte, musíte napísať export PATH="$HOME/opt/bin:$PATH" .

¹ V prípade rakiet Bourne to nebola pravda (ako v skutočných granátoch Bourne, nie v moderných granátoch v štýle POSIX), ale je nepravdepodobné, že by ste sa s takým starým nábojom v dnešnej dobe stretli.

Funguje to aj tak, ale nerobia to isté: prvky PATH sa kontrolujú zľava doprava. V prvom príklade spustiteľné súbory v ~/opt/bin bude mať prednosť pred tými, ktoré sú nainštalované napríklad v /usr/bin , čo môže, ale nemusí byť to, čo chcete.

Najmä z hľadiska bezpečnosti je nebezpečné pridávať cesty dopredu, pretože ak niekto môže získať prístup k zápisu do vášho ~/opt/bin , mohol by napríklad umiestniť iné súbory, ktoré by ste potom pravdepodobne použili namiesto / bin/ls bez povšimnutia Teraz si predstavte to isté ako pre ssh alebo váš prehliadač alebo voľbu... (To isté sa dá urobiť trikrát vo vašej ceste.)

Som zmätený otázkou 2 (pretože bola z otázky odstránená, pretože súvisela s nesúvisiacim problémom):

Čo efektívna metóda pridanie ďalších ciest k rôznym riadkom? Pôvodne som si myslel, že by to mohlo stačiť:

Export PATH=$PATH:~/opt/bin export PATH=$PATH:~/opt/node/bin

ale nie, pretože druhé priradenie nielenže pridá ~/opt/node/bin, ale aj všetky predtým priradené PATH .

Toto je možné riešenie:

Exportovať PATH=$PATH:~/opt/bin:~/opt/node/bin

ale kvôli čitateľnosti by som radšej mal jeden cieľ na cestu.

Ak poviete

PATH=~/opt/bin

Toto všetky,čo bude na vašej CESTE. PATH je len premenná prostredia a ak chcete pridať do PATH, musíte premennú znovu zostaviť s presne takým obsahom, aký chcete. Takže to, čo uvádzate ako príklad v otázke 2, je presne to, čo chcete urobiť, pokiaľ mi úplne neuniká pointa otázky.

Vo svojom kóde používam oba formuláre. Mám všeobecný profil, ktorý inštalujem na každý počítač, na ktorom pracujem, a ktorý vyzerá takto, aby vyhovoval potenciálne chýbajúcim adresárom:

Exportovať PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # pridať voliteľné položky do cesty pre bindir v $HOME/local/bin $HOME/bin; urobiť if [ -d $bindir ]; potom PATH=$PATH:$(bindir) je hotovo

Linux určuje cestu vyhľadávania spustiteľného súboru z prostredia $PATH. Ak chcete pridať adresár /data/myscripts na začiatok prostredia $PATH, použite nasledovné:

PATH=/data/myscripts:$PATH

Ak chcete pridať tento adresár na koniec cesty, použite nasledujúci príkaz:

PATH=$PATH:/data/myscripts

Ale predchádzajúce nestačia, pretože keď nastavíte premennú prostredia v skripte, táto zmena sa prejaví iba vo vnútri skriptu. Toto obmedzenie je obmedzené iba dvoma spôsobmi:

  • Ak exportujete premennú prostredia do skriptu, bude to účinné vo všetkých programoch, ktoré skript volá. Všimnite si, že to nie je účinné v programe nazývanom skript.
  • Ak to program volajúci skript urobí tak, že namiesto volania zahrnie, všetky zmeny prostredia skriptu sa prejavia vo volajúcom programe. Toto zahrnutie je možné vykonať pomocou príkazu bodka alebo príkazu source.

$HOME/myscript.sh zdroj $HOME/myscript.sh

Zahrnutie v podstate zahŕňa „volateľný“ skript v skripte „volania“. Je to podobné ako #include v C. Je teda účinné v rámci skriptu alebo volajúceho programu. Ale to samozrejme nie je účinné pre žiadne programy alebo skripty volané volajúcim programom. Aby to bolo účinné až po reťazec hovorov, musíte postupovať podľa nastavenia premennej prostredia pomocou príkazu export.

Napríklad program bash shell obsahuje obsah súboru .bash_profile zahrnutím. Takže pridanie nasledujúcich 2 riadkov do .bash_profile:

PATH=$PATH:/data/myscripts export PATH

efektívne vloží tieto 2 riadky kódu do bash programu. Teda v bash premenná$PATH obsahuje $HOME/myscript.sh a kvôli príkazu export budú mať všetky programy volané bashom $PATH upravenú. A keďže všetky programy spustené z výzvy bash sú volané pomocou bash, nová cesta je platná pre všetko, čo spustíte z výzvy bash.

Pointa je, že ak chcete pridať nový adresár do cesty, musíte pridať alebo pripojiť adresár k premennej prostredia $PATH v skripte, ktorý je súčasťou shellu, a musíte exportovať premennú prostredia $PATH.

Ďalšie informácie Tu

Už nejaký čas mám pri sebe dve funkcie pathadd a pathrm, ktoré pomáhajú pridávať prvky do cesty bez toho, aby som sa musel obávať duplikácií.

pathadd má jeden argument cesty a voliteľný argument za, ktorý sa po pridaní do PATH pridá, inak ho pridá.

V takmer každej situácii, ak pridáte cestu, pravdepodobne budete chcieť prepísať čokoľvek, čo už v ceste je, takže uprednostňujem predvolené pridávanie.

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; potom ak [ " $2" = "po" ] ; potom 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")" )

Umiestnite ich do ľubovoľného skriptu, v ktorom chcete zmeniť prostredie PATH, a teraz to môžete urobiť.

Pathadd "/foo/bar" cesta "/baz/bat" po exporte PATH

Zaručene nepridáte k ceste, ak už existuje. Ak teraz chcete, aby bol /baz/bat na začiatku.

Pathrm "/baz/bat" pathadd "/baz/bat" export PATH

Akákoľvek cesta môže byť teraz privedená dopredu, ak už je na ceste bez zdvojenia.

Nemôžem hovoriť za iné distribúcie, ale Ubuntu má súbor /etc/environment, ktorý je štandardnou cestou vyhľadávania pre všetkých používateľov. Keďže môj počítač používam iba ja, vložím do cesty ľubovoľné adresáre, ktoré chcem, pokiaľ je to dočasný doplnok, ktorý vložím do skriptu.

Tu je moje riešenie:

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

Pekná ľahká vložka, ktorá nezanecháva stopy:

Mne (na Mac OS X 10.9.5) pridanie názvu cesty (napr. /mypathname) do súboru /etc/paths fungovalo veľmi dobre.

Pred úpravou sa vráti echo $PATH:

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

Po úprave /etc/paths a reštartovaní shellu sa premenná $PATH pridá s /pathname . Skutočne, echo $PATH vráti:

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

Stalo sa, že /mypathname bol pridaný do $PATH .

Ak chcete pridať novú cestu do prostredia PATH PATH:

Exportovať PATH=$PATH:/nová-cesta/

Aby sa táto zmena vzťahovala na každý otvorený shell, pridajte ju do súboru, ktorý shell zavolá, keď ho zavoláte. V rôznych shelloch to môže byť:

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

Napríklad

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

Poskytnutú cestu môžete vidieť vo vyššie uvedenom výstupe.

Všetky súbory v Linuxe majú špecifickú adresu v súborovom systéme, pomocou ktorej k nim môžeme pristupovať pomocou správcu súborov alebo konzolových utilít. Toto je pomerne jednoduchá téma, ale veľa začiatočníkov s ňou má problémy.

V dnešnom krátkom článku sa pozrieme na to, aká je cesta k linuxovému súboru, čo to môže byť, ako ho správne napísať a mnoho ďalšieho. Ak ste s tým mali predtým problémy, po prečítaní článku bude všetko úplne jasné.

Cesty k súborom v systéme Linux

Systém súborov Linux je veľmi odlišný od systému Windows. Nebudeme uvažovať o jeho štruktúre; to bolo urobené skôr. Zameriame sa na prácu so súbormi.

Najdôležitejší rozdiel je v tom, že adresa súboru nezačína z jednotky, napríklad C:\ alebo D:\, ako sa to deje v systéme Windows, ale z koreňového adresára, koreňového adresára systému, ku ktorému sú pripojené všetky ostatné. Jeho adresa - /. A tu musíme hovoriť o adresách. Cesty k súborom v systéme Linux používajú na oddelenie adresárov v adrese lomku "/" a to sa líši od toho, čo ste zvyknutí vidieť v systéme Windows - \.

Napríklad, ak v Okná sú plné cesta k súboru na ploche vyzerala ako C:\Users\Sergiy\Desktop\, potom by cesta k súboru v Linuxe bola jednoducho /home/sergiy/desktop/. S týmto je zatiaľ všetko jednoduché a jasné. Problémy však vznikajú ďalej.

V operačnom systéme Linux môže existovať niekoľko typov ciest k súborom. Pozrime sa, aké cesty existujú v Linuxe:

  • Úplná absolútna linuxová cesta z koreňového adresára súborového systému- túto cestu ste už videli v príklade vyššie, začína od koreňa „/“ a popisuje celú cestu k súboru;
  • Relatívna cesta Linuxu- toto je cesta k súboru vzhľadom na aktuálny priečinok; takéto cesty často spôsobujú zmätok.
  • Cesta relatívna k domovskému priečinku aktuálneho používateľa.- cesta v súborovom systéme, ale nie z koreňového adresára, ale z priečinka aktuálneho používateľa.

Pozrime sa teraz bližšie na to, ako tieto cesty vyzerajú v Linuxe, a tiež sa pozrime na niekoľko príkladov, aby to bolo úplne jasné. Na ukážku použijeme utilitu ls, ktorá je určená na prezeranie obsahu adresárov.

Napríklad v našom domovskom priečinku máme adresár ako tento so štyrmi súbormi:

Takto bude vyzerať úplná cesta Linuxu k jednému zo súborov:

ls /home/sergiy/tmp/file1

Toto je už relatívna cesta pre Linux, ktorá začína v domovskom priečinku, je označená ~/. Všimnite si, nie ~, konkrétne ~/. Potom môžete zadať podpriečinky, v našom prípade tmp:

Alebo cesta k súboru v systéme Linux vo vzťahu k aktuálnemu priečinku:

Prvý odkaz ukazuje na aktuálny priečinok (.), druhý (..) ukazuje na vyšší priečinok. To otvára ešte väčšie možnosti pre navigáciu v katalógu. Ak chcete napríklad odkazovať na súbor v aktuálnom priečinku, môžete použiť nasledujúcu konštrukciu:

Toto je zbytočné pri prezeraní obsahu súboru. Je to však veľmi dôležité pri spúšťaní programu. Pretože program sa bude najskôr hľadať v prostredí PATH a až potom v tomto priečinku. Ak teda potrebujete spustiť program, ktorý sa nachádza v aktuálnom priečinku a volá sa presne rovnako ako ten v adresári /bin, potom bez explicitného odkazu, že musíte hľadať súbor v aktuálnom priečinku, nič nebude fungovať.

Takéto konštrukcie sa môžu pri kompilácii programov vyskytovať pomerne často. Všetky tieto symboly a cesty linuxových súborov môžete použiť nielen v termináli, ale aj v akomkoľvek Správca súborov, čo môže byť veľmi pohodlné.

ale Linuxový terminál poskytuje ešte väčšie možnosti. Priamo v adresách súborov alebo adresárov môžete použiť jednoduché zástupné znaky. Môžete napríklad uviesť všetky súbory začínajúce na f:

Alebo dokonca môžete vyhľadávať nielen v priečinku tmp, ale aj v akomkoľvek podpriečinku vášho domovského priečinka:

A to všetko bude fungovať, možno to nie je vždy potrebné a praktické. Ale v určitých situáciách môže veľmi pomôcť. Tieto funkcie sú implementované na úrovni shellu Bash, takže ich môžete použiť v akomkoľvek príkaze. Shell sa pozrie na to, koľko súborov sa našlo a pre každý z nich zavolá príkaz.

závery

To je všetko. Teraz viete všetko, čo potrebujete, aby ste nielen správne napísali cestu linuxový súbor, ale vykonávať aj zložitejšie akcie, ako je vyhľadávanie súborov alebo navigácia v adresároch pomocou príkazu cd. Ak máte nejaké otázky, opýtajte sa v komentároch!

Súvisiace príspevky:


Zaujímalo by ma, kde by sa mala pridať nová cesta do premennej prostredia PATH. Viem, že sa to dá dosiahnuť úpravou súboru .bashrc (napríklad), ale nie je jasné, ako to urobiť.

Takto:

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

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

11 odpovedí

Jednoduchý materiál

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

v závislosti od toho, či chcete pridať kód ~/opt/bin na koniec (pre vyhľadávanie všetkých ostatných adresárov, ak je program s rovnakým názvom vo viacerých adresároch) alebo na začiatok (pre vyhľadávanie pred všetkými ostatnými adresármi).

Môžete pridať viacero záznamov súčasne. PATH=$PATH:~/opt/bin:~/opt/node/bin alebo zmeny v poradí sú v poriadku.

Ak sa premenná už nachádza v prostredí, nemusíte exportovať: každá zmena hodnoty premennej sa prejaví v prostredí.¹ PATH je takmer vždy v prostredí; všetky unixové systémy ho nainštalujú veľmi skoro (v skutočnosti zvyčajne v prvom procese).

Ak je vaša PATH vytvorená mnohými rôznymi komponentmi, môžete skončiť s duplicitnými položkami. Pozrite si časť Ako pridať cestu do domovského adresára, ktorú Unix zistí, ktorý príkaz? a Odstráňte duplicitné položky $PATH pomocou príkazu awk, aby ste sa vyhli duplikátom alebo ich odstránili.

Kam dať

Všimnite si, že ~/.bash_rc nie je čitateľný žiadnym programom a ~/.bashrc je konfiguračný súbor pre interaktívne inštancie bash. V ~/.bashrc by ste nemali definovať premenné prostredia. Správne miesto na definovanie premenných prostredia, ako je PATH, je ~/.profile (alebo ~/.bash_profile, ak nemáte radi iné shelly ako bash). Pozrite si, aký je medzi nimi rozdiel a ktorý z nich mám použiť?

Poznámky k shellom bez bash

V bash, ksh a zsh je export špeciálnou syntaxou a PATH=~/opt/bin:$PATH aj export PATH=~/opt/bin:$PATH robia správnu vec. Na iných shelloch Bourne/POSIX, ako je napríklad dash (čo je na mnohých systémoch /bin/sh), sa export analyzuje ako normálny príkaz, čo znamená dva rozdiely:

  • ~ sa analyzuje iba na začiatku slova, s výnimkou priradení (pozri Ako pridám cestu domovského adresára, ktorú zistí Unix, ktorý vyžaduje príkaz? ;
  • $PATH externá dvojité úvodzovky preruší, ak PATH obsahuje medzery alebo \[*? .

Takže v shelloch, ako je pomlčka, export PATH=~/opt/bin:$PATH nastaví PATH na doslovný reťazec ~/opt/bin/: nasledovaný hodnotou PATH až na prvé miesto. PATH=~/opt/bin:$PATH (jednoduché priradenie) nevyžaduje úvodzovky a robí všetko správne. Ak chcete použiť export v prenosnom skripte, musíte napísať export PATH="$HOME/opt/bin:$PATH" alebo PATH=~/opt/bin:$PATH export PATH (alebo PATH=$HOME/opt /bin: $PATH export PATH pre prenosnosť aj do Bourne shellu, ktorý neakceptuje export var=value a nevykoná expanziu vlnovky).

¹ To nebola pravda v Bourne shelloch (ako v skutočnom Bourne shell, nie v moderných shelloch v štýle POSIX), ale je nepravdepodobné, že by ste sa v dnešnej dobe stretli s tak starými shellmi. Sub>

Obidva spôsoby fungujú, ale nerobia to isté: prvky PATH sa kontrolujú zľava doprava. V prvom príklade budú mať spustiteľné súbory v ~/opt/bin prednosť pred tými, ktoré sú nainštalované napríklad v /usr/bin , čo môže, ale nemusí byť to, čo chcete.

Najmä z hľadiska bezpečnosti je nebezpečné pridávať cesty dopredu, pretože ak niekto získa prístup na zápis do vášho ~/opt/bin , môže napríklad vložiť iný ls, ktorý pravdepodobne použijete namiesto /bin/ls bez povšimnutia. Teraz si predstavte to isté pre ssh alebo váš prehliadač alebo voľbu... (Tá istá vec sa vám na cestu postaví trikrát.)

Som zmätený otázkou 2 (pretože bola z otázky odstránená, pretože súvisela s nie súvisiaci problém):

Aký je efektívny spôsob pridania ďalších ciest k rôznym čiaram? Pôvodne som si myslel, že by to mohlo stačiť:

Export PATH=$PATH:~/opt/bin export PATH=$PATH:~/opt/node/bin

Nie je to však preto, že druhé priradenie nielenže pridá ~/opt/node/bin, ale aj predtým priradenú PATH .

Toto je možné riešenie:

Exportovať PATH=$PATH:~/opt/bin:~/opt/node/bin

Ale kvôli čitateľnosti by som radšej mal jeden cieľ na cestu.

Ak poviete

PATH=~/opt/bin

Toto všetky, ktorý bude vo vašej PATH. PATH je len premenná prostredia a ak chcete pridať do PATH, musíte premennú znovu zostaviť s presne takým obsahom, aký chcete. To znamená, že to, čo uvádzate ako príklad v otázke 2, je presne to, čo chcete urobiť, pokiaľ mi úplne unikla pointa otázky.

Vo svojom kóde používam oba formuláre. Mám všeobecný profil, ktorý inštalujem na každý počítač, na ktorom pracujem a ktorý vyzerá takto, na hosťovanie potenciálne chýbajúcich adresárov:

Exportovať PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # pridať voliteľné položky do cesty pre bindir v $HOME/local/bin $HOME/bin; urobiť if [ -d $bindir ]; potom PATH=$PATH:$(bindir) je hotovo

Linux definuje cestu vyhľadávania spustiteľného súboru pomocou premennej prostredia $PATH. Ak chcete pridať adresár /data/myscripts na začiatok premennej prostredia $PATH, použite nasledovné:

PATH=/data/myscripts:$PATH

Ak chcete pridať tento adresár na koniec cesty, použite nasledujúci príkaz:

PATH=$PATH:/data/myscripts

Ale predchádzajúce nestačia, pretože keď nastavíte premennú prostredia v skripte, táto zmena sa prejaví iba vo vnútri skriptu. Toto obmedzenie je obmedzené dvoma spôsobmi:

  • Ak exportujete premennú prostredia v rámci skriptu, bude účinná v rámci všetkých programov, ktoré skript volá. Všimnite si, že to nie je účinné v programe, ktorý volal skript.
  • Ak to program volajúci skript urobí tak, že namiesto volania zahrnie, všetky zmeny prostredia skriptu sa prejavia vo volajúcom programe. Toto zahrnutie je možné vykonať pomocou príkazu bodka alebo príkazu source.

$HOME/myscript.sh zdroj $HOME/myscript.sh

Zahrnutie v podstate zahŕňa „volateľný“ skript v skripte „volania“. Je to podobné ako #include v C. Je teda účinné v rámci skriptu alebo volajúceho programu. Ale to samozrejme nie je účinné pre žiadne programy alebo skripty volané volajúcim programom. Aby to bolo účinné až po reťazec hovorov, musíte postupovať podľa nastavenia premennej prostredia pomocou príkazu export.

Napríklad program bash shell obsahuje obsah súboru .bash_profile zahrnutím. Vložte teda nasledujúce 2 riadky do súboru .bash_profile:

PATH=$PATH:/data/myscripts export PATH

efektívne vloží tieto 2 riadky kódu do bash programu. Takže v bash premenná $PATH obsahuje $HOME/myscript.sh a kvôli príkazu export majú všetky programy volané bashom premennú $PATH upravenú. A keďže všetky programy, ktoré spustíte z výzvy bash, volá bash, nová cesta sa vzťahuje na všetko, čo spustíte z výzvy bash.

Pointa je, že ak chcete pridať nový adresár do cesty, musíte pridať alebo pripojiť adresár k premennej prostredia $PATH v skripte, ktorý je súčasťou shellu, a musíte exportovať premennú prostredia $PATH.

Už nejaký čas mám pri sebe dve funkcie pathadd a pathrm, ktoré pomáhajú pridávať prvky do cesty bez obáv z duplikácií.

pathadd má jeden argument cesty a voliteľný argument za, ktorý, ak sa pridá, bude pridaný do PATH, inak ho pridá.

V každej situácii, ak pridávate cestu, pravdepodobne budete chcieť prepísať čokoľvek, čo už v ceste je, takže uprednostňujem predvolené pridávanie.

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; potom ak [ " $2" = "po" ] ; potom 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")" )

Umiestnite ich do ľubovoľného skriptu, v ktorom chcete zmeniť prostredie PATH, a máte hotovo.

Pathadd "/foo/bar" cesta "/baz/bat" po exporte PATH

Zaručene nepridáte cestu, ak už existuje. Ak chcete, aby sa najskôr spustil /baz/bat.

Pathrm "/baz/bat" pathadd "/baz/bat" export PATH

Akákoľvek cesta môže byť teraz posunutá dopredu, ak už je na ceste bez zdvojenia.

Nepriestrelná metóda pridávania/predprípravy

Pri výbere pridávania a pridávania je potrebné zvážiť veľa. Mnohé z nich sú zahrnuté v iných odpovediach, takže ich tu nebudem opakovať.

Dôležité je, že aj keď systémové skripty nepoužívajú toto (zaujímalo by ma prečo) *1, je to nepriestrelný spôsob, ako pridať cestu (napr. $HOME/bin) do premennej prostredia PATH

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

pridať (namiesto PATH="$PATH:$HOME/bin") a

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

pridať (namiesto PATH="$HOME/bin:$PATH")

Vyhnete sa tak falošnej začiatočnej/koncovej dvojbodke, keď je $PATH na začiatku prázdna, čo môže mať nežiaduce vedľajšie účinky a hľadanie môže byť nočnou morou (táto odpoveď sa stručne zaoberá prípadom awk-way).

$(parameter:+word)

Ak je parameter nulový alebo nie je nastavený, nič sa nenahradí, inak sa nahradí slovo slovo.

Takže $(PATH:+$(PATH):) sa rozšíri na: 1) nič, ak je PATH nulová alebo nenastavená, 2) $(PATH): ak je PATH nastavená.

Poznámka. Toto je pre bash.

*1 Práve som zistil, že skripty ako devtoolset-6/enable to používajú, $ cat /opt/rh/devtoolset-6/enable # Export všeobecných premenných prostredia PATH=/opt/rh/devtoolset-6/root/usr /bin $(PATH:+:$(PATH)) ...

Nemôžem hovoriť za iné distribúcie, ale Ubuntu má súbor /etc/environment, ktorý je predvolenou cestou vyhľadávania pre všetkých používateľov. Keďže môj počítač používam iba ja, vložím tam do cesty ľubovoľné adresáre, ktoré chcem, pokiaľ to nie je dočasný doplnok, ktorý som vložil do skriptu.

Mne (na Mac OS X 10.9.5) pridanie názvu cesty (napr. /mypathname) do súboru /etc/paths fungovalo veľmi dobre.

Pred úpravou sa vráti echo $PATH:

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

Po úprave /etc/paths a reštartovaní shellu sa premenná $PATH pridá s /pathname . Skutočne, echo $PATH vráti:

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

Stalo sa to, že /mypathname bol pridaný do premennej $PATH.