Cum să adăugați un program la calea linux. Variabila de mediu PATH. Setarea variabilei de mediu PATH pe Linux și Mac OS folosind shell-ul Bash

SDK-ul AIR conține mai multe programe din care puteți rula linie de comandă sau ferestrele terminalului. Va fi mult mai ușor să rulați aceste programe dacă definiți calea către directorul SDK bin folosind variabila de mediu Path.

Această secțiune prezintă descriere generală proceduri pentru setarea căii pe Windows, Mac și Linux. Cu toate acestea, configurațiile computerului pot varia semnificativ, așadar această procedură Nu funcționează pe toate sistemele. În acest caz informatiile necesare poate fi găsit în documentația sistemului de operare sau pe Internet.

Setarea variabilei de mediu PATH pe Linux și Mac OS folosind shell-ul Bash

Când o comandă este introdusă într-o fereastră de terminal, shell-ul (programul care citește comenzile introduse și încearcă să răspundă corespunzător) trebuie să găsească mai întâi programul de comandă în sistem de fișiere. Shell caută comenzi într-o listă de directoare, care este stocată într-o variabilă de mediu numită $PATH. Pentru a vizualiza valoarea curentă a variabilei cale, introduceți următoarea comandă:

Echo $PATH

Va fi scoasă o listă de directoare, separate prin două puncte, care arată cam așa:

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

Calea către directorul bin AIR SDK trebuie adăugată la această listă, astfel încât shell-ul să poată găsi instrumente ADT și ADT. Să presupunem că AIR SDK se află în directorul /Users/fred/SDKs/AIR. În acest caz, utilizați următoarea comandă pentru a adăuga directoarele dorite la variabila de mediu cale:

Export PATH=$PATH:/Users/fred/SDK-uri/AIR/bin:/Users/fred/SDK-uri/android/tools

Nota. Dacă calea conține spații, ar trebui să le precedeți cu o bară oblică inversă, așa cum se arată mai jos:

/Utilizatori/fred\ jones/SDKs/AIR\ 2.5\ SDK/bin

Pentru a verifica rezultatele adăugării, puteți rula din nou comanda echo:

Echo $PATH /usr/bin:/bin:/usr/sbin:/usr/local/bin:/usr/x11/bin:/Users/fred/SDKs/AIR/bin:/Users/fred/SDK-uri/android/ unelte

Directoarele au fost adăugate cu succes. Acum puteți apela următoarele comenzi și puteți obține răspunsul corect:

Adt-versiune

Dacă variabila de mediu $PATH a fost modificată corect, comanda ar trebui să returneze versiunea mediului ADT.

Există însă o problemă: atunci când deschideți o nouă fereastră de terminal, veți observa că variabila cale nu mai conține elementele noi care au fost adăugate anterior. Comanda de configurare a căii trebuie să fie executată de fiecare dată când porniți un terminal nou.

O soluție comună la această problemă este adăugarea comenzii la unul dintre scripturile de pornire utilizate de shell. Pe Mac OS, puteți crea un fișier .bash_profile în directorul ~/username care va fi lansat de fiecare dată când deschideți o nouă fereastră de terminal. Pe Ubuntu, scriptul care rulează atunci când deschideți o nouă fereastră de terminal este .bashrc. În altele distribuții Linux Reguli similare se aplică și pentru scoici.

Procedura pentru adăugarea unei comenzi la un script de pornire shell

    Schimbați directorul principal:

    Creați un profil de configurare shell (dacă este necesar) și redirecționați textul de intrare la sfârșitul fișierului folosind comanda " cat >> ". Utilizați fișierul potrivit pentru dvs sistem de operare si scoici. De exemplu, pe Mac OS puteți folosi .bash_profile , iar pe Ubuntu puteți folosi .bashrc .

    Cat >> .bash_profile

    Introduceți textul pe care doriți să îl adăugați în fișier:

    Export PATH=$PATH:/Users/cward/SDK-uri/android/tools:/Users/cward/SDK-uri/AIR/bin

    Completați redirecționarea textului apăsând CTRL-SHIFT-D de pe tastatură.

    Afișați fișierul pentru a vă asigura că operația este efectuată corect:

    Cat.bash_profile

    Deschideți o nouă fereastră de terminal pentru a verifica calea:

    Echo $PATH

    Elementele adăugate ar trebui să fie afișate pe ecran.

Dacă este creat ulterior noua versiune unul dintre SDK-urile care vor fi plasate într-un director diferit, comanda de setare a căii din fișierul de configurare va trebui actualizată în consecință. În caz contrar, shell-ul va continua să folosească versiunea veche.

Setarea variabilei de mediu PATH pe Windows

Când o fereastră de comandă este deschisă în Windows, aceasta moștenește variabilele de mediu globale definite în Proprietăți sistem. O variabilă importantă este variabila cale, care conține o listă de directoare în care este căutat programul introdus. Pentru a vizualiza lista curentă de directoare din variabila cale, puteți introduce următoarea comandă în fereastra de comandă:

Setați calea

Aceasta va afișa o listă de directoare separate prin puncte, care arată cam așa:

Cale=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem

Calea către directorul bin AIR SDK trebuie adăugată la această listă, astfel încât programul de comandă să poată găsi instrumente ADT și ADT. Să presupunem că AIR SDK se află în directorul C:\SDKs\AIR. În acest caz, calea poate fi adăugată după cum urmează:

    În Panoul de control, deschideți caseta de dialog Proprietăți sistem sau faceți clic clic dreapta mouse-ul pe pictograma „Computerul meu” și selectați „Proprietăți” din meniu.

    În fila Avansat, faceți clic pe butonul Variabile de mediu.

    În secțiunea Variabile de sistem a casetei de dialog Variabile de mediu, selectați Cale.

    Faceți clic pe butonul „Editați”.

    Mergeți la sfârșitul rândului în câmpul Valoare variabilă.

    La sfârșitul valorii curente, introduceți următorul text:

    ;C:\SDK-uri\AIR\bin

    Faceți clic pe „OK” în toate casete de dialog pentru a salva calea.

Dacă în acest moment sunt deschise ferestre de comandă, modificările pentru acestea nu vor fi aplicate. Deschideți o nouă fereastră de comandă și introduceți următoarea comandă pentru a vă asigura că variabila de mediu este setată corect:

Adt-versiune

Dacă locația SDK-ului AIR este modificată ulterior sau este adăugată o nouă versiune, variabila de mediu cale va trebui modificată în consecință.

Mă întreb unde ar trebui adăugată noua cale la variabila de mediu PATH. Știu că acest lucru poate fi realizat prin editarea .bashrc (de exemplu), dar nu este clar cum se face acest lucru.

Astfel:

Export PATH=~/opt/bin:$PATH

Export PATH=$PATH:~/opt/bin

11 răspunsuri

Material simplu

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

în funcție de dacă doriți să adăugați ~/opt/bin la sfârșit (pentru a căuta în toate celelalte directoare dacă există un program cu același nume în mai multe directoare) sau la început (pentru a căuta înaintea tuturor celorlalte directoare).

Puteți adăuga mai multe intrări în același timp. PATH=$PATH:~/opt/bin:~/opt/node/bin sau modificările la comandă sunt în regulă.

Nu trebuie să exportați dacă variabila este deja în mediu: orice modificare a valorii variabilei se reflectă în mediu.¹ PATH este aproape întotdeauna în mediu; Toate sisteme unix instalați-l foarte devreme (de obicei, în primul proces, de fapt).

Dacă PATH este creat de mai multe componente diferite, este posibil să ajungeți cu intrări duplicat. Vedeți Cum să adăugați o cale la directorul dvs. de acasă care va fi detectată de Unix, care comandă? și Eliminați intrările $PATH duplicate folosind comanda awk pentru a evita duplicatele sau pentru a le elimina.

Unde să pun

Rețineți că ~/.bash_rc nu poate fi citit de niciun program, iar ~/.bashrc este fișierul de configurare pentru instanțe interactive bash. Nu ar trebui să definiți variabilele de mediu în ~/.bashrc . Locul corect pentru a defini variabilele de mediu, cum ar fi PATH este ~/.profile (sau ~/.bash_profile dacă nu vă plac alte shell-uri decât bash). Vedeți Care este diferența dintre ele și pe care ar trebui să îl folosesc?

Note despre cochilii non-bash

În bash, ksh și zsh, exportul este o sintaxă specială și atât PATH=~/opt/bin:$PATH, cât și export PATH=~/opt/bin:$PATH fac chiar și ceea ce trebuie. Pe alte shell-uri Bourne/POSIX, cum ar fi dash (care este /bin/sh pe multe sisteme), exportul este analizat ca o comandă normală, ceea ce implică două diferențe:

  • ~ este analizat doar la începutul unui cuvânt, cu excepția sarcinilor (vezi Cum adaug o cale de director de acasă care va fi detectată de Unix care necesită comanda? ;
  • $PATH ghilimelele exterioare se întrerup dacă PATH conține spații sau \[*? .

Deci, în shell-uri precum dash, exportați PATH=~/opt/bin:$PATH setează PATH la șirul literal ~/opt/bin/: urmat de valoarea PATH până la primul loc.

PATH=~/opt/bin:$PATH (atribuire simplă) nu necesită ghilimele și face totul corect. Dacă doriți să utilizați exportul într-un script portabil, trebuie să scrieți export PATH="$HOME/opt/bin:$PATH" sau PATH=~/opt/bin:$PATH export PATH (sau PATH=$HOME/opt /bin: $PATH export PATH pentru portabilitate chiar și către shell-ul Bourne, care nu acceptă export var=value și nu a făcut extinderea tilde).

¹ Acest lucru nu a fost adevărat în shell-urile Bourne (ca și în shell-urile Bourne actuale, nu shell-urile moderne în stil POSIX), dar este puțin probabil să întâlniți shell-uri atât de vechi în zilele noastre. Sub>

Oricum funcționează, dar nu fac același lucru: elementele PATH sunt verificate de la stânga la dreapta. În primul exemplu, executabilele din ~/opt/bin vor avea prioritate față de cele instalate în, de exemplu, /usr/bin , care poate fi sau nu ceea ce doriți.

În special, este periculos din punct de vedere al securității să adăugați căi în față, deoarece dacă cineva poate obține acces de scriere la ~/opt/bin , ar putea pune un alt l, de exemplu, pe care probabil îl veți folosi în loc /bin/ls fără a observa. Acum imaginați-vă același lucru pentru ssh sau browserul sau alegerea dvs.... (Același lucru de trei ori pus pe calea dvs.)

Sunt confuz cu privire la întrebarea 2 (din moment ce a fost eliminată din întrebare deoarece era legată de o problemă fără legătură): mod eficient adăugarea de căi suplimentare la linii diferite?

Inițial, m-am gândit că asta ar putea face smecheria:

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

Dar asta nu se datorează faptului că a doua atribuire nu numai că adaugă ~/opt/node/bin, ci și PATH atribuită anterior.

Aceasta este o posibilă soluție:

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

Dar pentru lizibilitate, aș prefera să am o destinație pe cale.

Dacă spui

PATH=~/opt/bin Acest toate

, care va fi în calea ta. PATH este doar o variabilă de mediu și, dacă doriți să adăugați la PATH, trebuie să reconstruiți variabila cu exact conținutul dorit. Adică ceea ce dați ca exemplu la întrebarea 2 este exact ceea ce doriți să faceți, cu excepția cazului în care am ratat complet sensul întrebării.

Folosesc ambele forme în codul meu. Am un profil general pe care îl instalez pe fiecare mașină pe care lucrez și care arată astfel, pentru a găzdui directoare potențial lipsă:

Export PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # adăugați elemente opționale la calea pentru bindir în $HOME/local/bin $HOME/bin; face if [ -d $bindir ]; apoi PATH=$PATH:$(bindir) fi terminat

Linux definește calea de căutare executabilă cu variabila de mediu $PATH. Pentru a adăuga directorul /data/myscripts la începutul variabilei de mediu $PATH, utilizați următoarele:

PATH=/data/myscripts:$PATH

Pentru a adăuga acest director la sfârșitul căii, utilizați următoarea comandă:

PATH=$PATH:/data/myscripts

  • Dar cele anterioare nu sunt suficiente pentru că atunci când setați o variabilă de mediu în interiorul unui script, acea modificare are efect doar în interiorul scriptului. Această limitare este limitată în două moduri:
  • Dacă exportați o variabilă de mediu într-un script, aceasta este eficientă în orice program numit de script. Rețineți că acest lucru nu este eficient în programul care a numit scriptul.

Dacă programul care apelează scriptul face acest lucru prin includerea în loc de a apela, orice modificări de mediu aduse scriptului sunt efective pentru programul apelant. Această includere se poate face folosind comanda dot sau comanda sursă.

Includerea include practic scriptul „callable” în scriptul „call”. Acest lucru este similar cu #include în C. Deci este eficient în interiorul unui script sau program de apelare. Dar, desigur, acest lucru nu este eficient pentru niciun program sau script apelat de programul apelant. Pentru a fi eficient până la lanțul de apeluri, trebuie să urmați setarea variabilei de mediu folosind comanda de export.

Ca exemplu, programul shell bash include conținutul fișierului .bash_profile prin includere. Deci, puneți următoarele 2 rânduri în .bash_profile:

PATH=$PATH:/data/myscripts exportă PATH

pune efectiv acele 2 linii de cod într-un program bash. Deci, în bash, variabila $PATH include $HOME/myscript.sh și, din cauza instrucțiunii de export, orice program apelat de bash are variabila $PATH modificată. Și deoarece toate programele pe care le lansați din promptul bash sunt apelate de bash, noua cale se aplică la orice lansați din promptul bash.

Concluzia este că pentru a adăuga un nou director la cale, trebuie să adăugați sau să adăugați directorul la variabila de mediu $PATH într-un script inclus în shell și trebuie să exportați variabila de mediu $PATH.

Am ținut cu mine de ceva timp două funcții pathadd și pathrm care ajută la adăugarea de elemente într-o cale fără a-ți face griji cu privire la dublări.

pathadd ia un argument cale și un argument opțional după, care, dacă este adăugat, va fi adăugat la PATH , altfel îl va adăuga.

În orice situație, dacă adăugați o cale, probabil că doriți să suprascrieți ceea ce este deja în cale, așa că prefer să adaug în mod implicit.

Pathadd() ( element nou=$(1%/) dacă [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$element nou($|:)" ; atunci dacă [ " $2" = "după" ] ; apoi 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")" )

Plasați-le în orice script doriți pentru a schimba mediul PATH și ați terminat.

Pathadd „/foo/bar” pathadd „/baz/bat” după export PATH

Sunteți garantat să nu adăugați o cale dacă aceasta există deja. Dacă doriți ca /baz/bat să fie rulat mai întâi.

Pathrm „/baz/bat” pathadd „/baz/bat” export PATH

Orice cale poate fi mutată acum în față dacă se află deja pe o cale fără a se dubla.

Metodă de adăugare/pregătire antiglonț

Există multe considerații implicate în alegerea de a adăuga și de a adăuga. Multe dintre ele sunt acoperite în alte răspunsuri, așa că nu le voi repeta aici.

Punctul important este că, chiar dacă scripturile de sistem nu folosesc acest lucru (mă întreb de ce) *1, este o modalitate fără glonț de a adăuga o cale (de exemplu, $HOME/bin) la variabila de mediu PATH

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

pentru a adăuga (în loc de PATH="$PATH:$HOME/bin") și

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

pentru a adăuga (în loc de PATH="$HOME/bin:$PATH")

Acest lucru evită un fals două puncte de început/final atunci când $PATH este inițial gol, ceea ce poate avea efecte secundare nedorite și poate fi un coșmar de găsit (acest răspuns abordează pe scurt cazul awk-way).

$(parametru:+cuvânt)

Dacă parametrul este nul sau nesetat, nimic nu este înlocuit, altfel este înlocuit cuvânt cuvânt.

Deci $(PATH:+$(PATH):) se extinde la: 1) nimic dacă PATH este nul sau nesetat, 2) $(PATH): dacă PATH este setat.

Nota. Asta e pentru bash.

*1 Tocmai am descoperit că scripturile precum devtoolset-6/enable folosesc acest lucru, $ cat /opt/rh/devtoolset-6/enable # Variabilele generale de mediu export PATH=/opt/rh/devtoolset-6/root/usr /bin $(CALEA:+:$(CALEA)) ...

Nu pot vorbi pentru alte distribuții, dar Ubuntu are un fișier, /etc/environment, care este calea de căutare implicită pentru toți utilizatorii. Deoarece computerul meu este folosit doar de mine, am pus orice directoare vreau în calea mea acolo, cu excepția cazului în care este o adăugare temporară pe care am pus-o în script.

Pentru mine (pe Mac OS X 10.9.5) adăugarea numelui de cale (de ex. /mypathname) la fișierul /etc/paths a funcționat foarte bine.

Înainte de editare, echo $PATH este returnat:

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

După editarea /etc/paths și repornirea shell-ului, variabila $PATH este adăugată cu /pathname . Într-adevăr, echo $PATH returnează:

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

Ce sa întâmplat a fost că /mypathname a fost adăugat la variabila $PATH.

După cum știți deja, atunci când orice utilizator se conectează în sistem, este lansată o instanță shell specială pentru el - shell de conectare. În timp ce rulează ca shell de conectare bash caută următoarele fișiere:

  • /etc/profile
  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profil

(în ordinea specificată) și execută comenzile conținute în acestea. Dacă bash este rulat din nou din linia de comandă în modul interactiv (adică pentru a nu executa nicio comandă unică), apoi găsește fișierul ~/.bashrc și execută comenzile conținute în acesta. Cu toate acestea, în distribuția Mandrake, fișierul ~/.bashrc este de asemenea apelat pentru shell-ul de conectare, iar fișierul la nivel de sistem /etc/bashrc este, de asemenea, apelat din acesta. Deci, după cum puteți vedea, există opțiuni aici.

Dar indiferent de secvența de apelare a acestor scripturi, cu ajutorul lor, pentru fiecare sesiune de utilizator, se creează un așa-numit „mediu utilizator” sau mediu, care este un set de variabile cu valori setate pentru ele. Aceste valori sunt citite de unele programe și utilitare, iar în conformitate cu valorile acestora, comportamentul sistemului în anumite situații se modifică.

Fișierele /etc/profile și /etc/bashrc definesc setările pentru mediul utilizatorului la nivel de sistem, în timp ce fișierele rămase enumerate definesc mediul utilizatorului individual. Adăugările sau corecțiile relativ mici la fișierele de setări individuale care modifică valorile implicite pot face experiența sistemului dvs. mult mai plăcută (gustul, după cum știm, nu este o dispută și este puțin probabil ca persoanele care au determinat setările implicite ghicit preferințele tale). Deci, să aruncăm o privire rapidă la variabilele de bază ale mediului utilizator și la modul în care le puteți modifica singur.

În primul rând, uitați-vă la variabilele de mediu care sunt setate implicit. După cum am spus deja în secțiune 5.6, acest lucru se poate face folosind comenzile set(și comandă similară tipărit) sau înv. Valoarea atribuită unei variabile individuale poate fi vizualizată folosind comanda echo $nume, Unde nume- numele variabilei.

Dintre toate variabilele pe care le veți vedea pe comandă set, schimba de obicei aspectul promptului PS1 și lista căilor de căutare PATH. Modul de modificare a valorilor acestor variabile a fost descris în detaliu în secțiune 5.6. Dacă ați ratat cumva această secțiune, verificați-o acum. Deci, tot ce rămâne este să decideți în ce script să setați noi valori pentru aceste variabile. Să ne uităm la această problemă folosind variabila PATH ca exemplu.

Variabila PATH este formată în două scripturi: /etc/profile (căi comune tuturor utilizatorilor) și într-unul dintre scripturile utilizator (de exemplu, în ~/.bash_profile), unde utilizatorul poate adăuga căi la lista generată anterior la voinţă. Doar nu faceți acest lucru în fișierul ~/bashrc, deoarece acesta din urmă este repornit de fiecare dată când porniți a doua, a treia, etc. instanță a shell-ului. Pentru a adăuga o cale la variabila PATH, trebuie să introduceți linia în scriptul selectat următorul tip(în acest exemplu calea /home/user/bin este adăugată la listă):

PATH=$PATH:/home/user/bin

Vă rugăm să rețineți că nu există două puncte la sfârșit. Și rețineți că directoarele sunt căutate pentru fișierul în ordinea în care sunt listate în variabila PATH.

Spre deosebire de MS-DOS, Linux nu caută fișierul executabil în directorul curent. Prin urmare, dacă doriți ca căutarea să fie efectuată în directorul curent, trebuie să adăugați acest director (rețineți că are un nume format dintr-un singur punct) la variabila PATH. Dar rețineți că din punct de vedere al securității, adăugarea directorului curent la lista căilor de căutare este inacceptabilă, deoarece un atacator poate plasa un program rău intenționat numit după unul dintre utilitarele de sistem utilizate frecvent într-unul dintre directoarele accesibile lui. prin scriere. Și, atunci când rulați acest program, gândindu-vă că rulați un utilitar de sistem, acesta poate provoca un mare rău sistemului dvs., mai ales dacă îl rulați ca superutilizator.

Dacă doriți, puteți să vă „decorați viața” puțin, activând ieșirea color în comandă ls(dacă este implicit alb-negru). Pentru a face acest lucru, editați fișierul /etc/bashrc și adăugați linia:

alias ls = "ls -F --culoare"

Apropo, dacă doriți ca comanda Midnight din fereastra emulatorului de terminal să fie color și nu alb-negru, atunci setați variabila COLORTERM:

COLORTERM = ; export COLORTERM

V. Kostromin (kos la rus-linux dot net) - 8.8. Configurarea mediului de utilizator

export PATH=~/opt/bin:$PATH

Export PATH=$PATH:~/opt/bin

9 soluții colectează formulare web pentru „Cum se adaugă corect o cale către PATH?”

Lucruri simple

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

în funcție de dacă doriți să adăugați ~/opt/bin la sfârșit (pentru a căuta în toate celelalte directoare dacă există un program cu același nume în mai multe directoare) sau la început (pentru a căuta înaintea tuturor celorlalte directoare).

Puteți adăuga mai multe intrări în același timp. PATH=$PATH:~/opt/bin:~/opt/node/bin sau modificările la comandă sunt în regulă.

Nu trebuie să exportați dacă variabila este deja în mediu: orice modificare a valorii variabilei este reflectată în mediu. toate sistemele Unix îl instalează foarte devreme (de obicei, în primul proces, de fapt).

Dacă PATH este încorporat diferite componente, este posibil să ajungeți cu intrări duplicat. Vedeți Cum să adăugați calea către directorul sursă pentru a fi detectat de Unix, care este comanda? și eliminați intrările $PATH duplicate folosind comanda awk pentru a evita adăugarea de duplicate sau eliminarea acestora.

Unde să pun

Rețineți că ~/.bash_rc nu poate fi citit de niciun program, iar ~/.bashrc este fișierul de configurare pentru instanțe interactive bash. Nu ar trebui să definiți variabilele de mediu în ~/.bashrc . Locul corect pentru a defini variabilele de mediu precum PATH este ~/.profile (sau ~/.bash_profile dacă nu aveți nevoie de shell-uri non-bash). Vezi care este diferența dintre ele și pe care ar trebui să îl folosesc?

Note despre cochilii non-bash

În bash, ksh și zsh, exportul este o sintaxă specială și atât PATH=~/opt/bin:$PATH, cât și export PATH=~/opt/bin:$PATH fac totul corect. Pe alte shell-uri Bourne/POSIX, cum ar fi dash (care este /bin/sh pe multe sisteme), exportul este analizat ca o comandă normală, ceea ce implică două diferențe:

  • ~ este analizat doar la începutul unui cuvânt, cu excepția sarcinilor (vezi secțiunea „Cum se adaugă o cale către un director sursă care va fi detectat de Unix, ce comandă?”).
  • $PATH în afara ghilimelelor duble se întrerupe dacă PATH conține spații sau \[*? ,

Deci, în shell-uri de tip liniuță, export PATH=~/opt/bin:$PATH setează PATH la șirul literal ~/opt/bin/: urmat de valoarea PATH până la primul loc. PATH=~/opt/bin:$PATH (atribuire neclară) nu necesită ghilimele și face ceea ce trebuie. Dacă doriți să utilizați exportul într-un script portabil, trebuie să scrieți export PATH="$HOME/opt/bin:$PATH" .

¹ Acest lucru nu a fost adevărat în rachetele Bourne (ca și în obuzele Bourne actuale, nu în obuzele moderne în stil POSIX), dar este puțin probabil să întâlniți obuze atât de vechi în zilele noastre.

Funcționează oricum, dar nu fac același lucru: elementele PATH sunt verificate de la stânga la dreapta. În primul exemplu, executabilele din ~/opt/bin vor avea prioritate față de cele instalate în, de exemplu, /usr/bin , care poate fi sau nu ceea ce doriți.

În special din punct de vedere al securității, este periculos să adăugați căi în față, deoarece dacă cineva poate obține acces de scriere la ~/opt/bin , ar putea, de exemplu, să plaseze alte l-uri pe care probabil le-ați folosi în loc de / bin/ls fără să observi. Acum imaginați-vă la fel ca pentru ssh sau browser-ul sau alegerea dvs. (Același lucru poate fi făcut de trei ori pe drum.)

Sunt confuz de întrebarea 2 (deoarece a fost eliminată din întrebare deoarece era legată de o problemă fără legătură):

Care este o modalitate eficientă de a adăuga căi suplimentare la diferite linii? Inițial, m-am gândit că asta ar putea face smecheria:

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

dar nu, deoarece a doua atribuire nu numai că adaugă ~/opt/node/bin, ci și toate PATH atribuite anterior.

Aceasta este o posibilă soluție:

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

dar pentru lizibilitate aș prefera să am o destinație pe cale.

Dacă spui

Dacă spui

PATH=~/opt/bin Toate, ce va fi în calea ta. PATH este doar o variabilă de mediu și, dacă doriți să adăugați la PATH, trebuie să reconstruiți variabila cu exact conținutul dorit. Deci ceea ce dați ca exemplu la întrebarea 2 este exact ceea ce doriți să faceți, cu excepția cazului în care pierd complet sensul întrebării.

Folosesc ambele forme în codul meu. Am un profil general pe care îl instalez pe fiecare computer pe care lucrez și care arată astfel pentru a găzdui directoarele care pot lipsi:

Export PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # adăugați elemente opționale la calea pentru bindir în $HOME/local/bin $HOME/bin; face if [ -d $bindir ]; apoi PATH=$PATH:$(bindir) fi terminat

Linux determină calea de căutare executabilă din mediul $PATH. Pentru a adăuga directorul /data/myscripts în partea de sus a mediului $PATH, utilizați următoarele:

Linux definește calea de căutare executabilă cu variabila de mediu $PATH. Pentru a adăuga directorul /data/myscripts la începutul variabilei de mediu $PATH, utilizați următoarele:

PATH=/data/myscripts:$PATH

Pentru a adăuga acest director la sfârșitul căii, utilizați următoarea comandă:

Dar cele anterioare nu sunt suficiente pentru că atunci când setați o variabilă de mediu în interiorul unui script, acea modificare are efect doar în interiorul scriptului. Această limitare este limitată doar în două moduri:

  • Dacă exportați o variabilă de mediu într-un script, aceasta este eficientă în toate programele numite de script. Rețineți că acest lucru nu este eficient într-un program numit script.
  • Dacă programul care apelează scriptul face acest lucru prin includerea în loc de a apela, orice modificări de mediu aduse scriptului sunt efective pentru programul apelant. Această includere se poate face folosind comanda dot sau comanda sursă.

$HOME/myscript.sh sursa $HOME/myscript.sh

Includerea include practic scriptul „callable” în scriptul „call”. Acest lucru este similar cu #include în C. Deci este eficient în interiorul unui script sau program de apelare. Dar, desigur, acest lucru nu este eficient pentru niciun program sau script apelat de programul apelant. Pentru a fi eficient până la lanțul de apeluri, trebuie să urmați setarea variabilei de mediu folosind comanda de export.

Ca exemplu, programul shell bash include conținutul fișierului .bash_profile prin includere. Deci, adăugând următoarele 2 linii la .bash_profile:

PATH=$PATH:/data/myscripts exportă PATH

pune efectiv acele 2 linii de cod într-un program bash. Deci, în bash, variabila $PATH include $HOME/myscript.sh și, din cauza instrucțiunii de export, orice program apelat de bash are $PATH modificat. Și deoarece toate programele lansate din promptul bash sunt apelate de bash, noua cale este valabilă pentru orice lansați din promptul bash.

Concluzia este că, pentru a adăuga un nou director la cale, trebuie să adăugați sau să adăugați directorul la variabila de mediu $PATH în scriptul inclus în shell și trebuie să exportați variabila de mediu $PATH.

Informații suplimentare Aici

De ceva timp am ținut cu mine două funcții pathadd și pathrm care ajută la adăugarea de elemente la o cale fără a fi nevoie să vă faceți griji cu privire la dublări.

pathadd ia un argument cale și un argument opțional după care, dacă este adăugat, va fi adăugat la PATH, altfel îl va adăuga.

În aproape toate situațiile, dacă adăugați o cale, probabil că doriți să suprascrieți tot ceea ce este deja în cale, așa că prefer să adaug în mod implicit.

Pathadd() ( element nou=$(1%/) dacă [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$element nou($|:)" ; atunci dacă [ " $2" = "după" ] ; apoi 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")" )

Plasați-le în orice script pe care doriți să schimbați mediul PATH și acum puteți face acest lucru.

Pathadd „/foo/bar” pathadd „/baz/bat” după export PATH

Sunteți garantat să nu adăugați la o cale dacă aceasta există deja. Dacă acum doriți ca /baz/bat să fie la început.

Pathrm „/baz/bat” pathadd „/baz/bat” export PATH

Orice potecă poate fi acum adusă în față dacă se află deja pe o potecă fără a se dubla.

Nu pot vorbi pentru alte distribuții, dar Ubuntu are un fișier, /etc/environment, care este calea de căutare standard pentru toți utilizatorii. Deoarece computerul meu este folosit doar de mine, pun orice directoare vreau în calea mea, atâta timp cât este o adăugare temporară pe care o pun în script.

Iată soluția mea:

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

Căptușeală ușoară frumoasă care nu lasă urme:

Pentru mine (pe Mac OS X 10.9.5) adăugarea numelui căii (de ex. /mypathname) la fișierul /etc/paths a funcționat foarte bine.

Înainte de editare, echo $PATH este returnat:

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

După editarea /etc/paths și repornirea shell-ului, variabila $PATH este adăugată cu /pathname . Într-adevăr, echo $PATH returnează:

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

Ce s-a întâmplat a fost că /mypathname a fost adăugat la $PATH .

Pentru a adăuga o nouă cale la mediul PATH PATH:

Export PATH=$PATH:/new-path/

Pentru ca această modificare să se aplice fiecărui shell pe care îl deschideți, adăugați-l la un fișier pe care shell-ul îl va apela când îl apelați. În diferite cochilii, acesta ar putea fi:

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

De exemplu

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

Puteți vedea calea furnizată în rezultatul de mai sus.