Cum se configurează smartphone-uri și PC-uri. Portal de informare
  • Acasă
  • Windows 10
  • Variabila de mediu PATH. Variabilă de mediu PATH Variabilă de cale în linux

Variabila de mediu PATH. Variabilă de mediu PATH Variabilă de cale în linux

Când introduceți o comandă la promptul de comandă, în principiu îi spuneți shell-ului să ruleze un fișier executabil cu numele dat. Pe Linux, aceste programe executabile precum ls, find, file și altele tind să locuiască în mai multe directoare diferite de pe sistemul dumneavoastră. Orice fișier cu permisiuni executabile stocat în aceste directoare poate fi rulat de oriunde. Cele mai comune directoare care conțin programe executabile sunt /bin, /sbin, /usr/sbin, /usr/local/bin și /usr/local/sbin.

Dar de unde știe shell-ul ce directoare să caute programe executabile sau shell-ul caută în întregul sistem de fișiere?

Răspunsul este simplu. Când lansați o comandă, shell-ul caută în toate directoarele specificate în variabila $PATH a utilizatorului pentru un fișier executabil cu acest nume.

Acest articol vă arată cum să adăugați directoare la variabila $PATH de sistem.

Ce este $PATH în Linux

Variabila de mediu $PATH este o listă de directoare colonizată cu două puncte, care spune shell-ului ce directoare să caute fișiere executabile.

Pentru a verifica ce directoare aveți în variabila $PATH, puteți utiliza comanda printenv sau echo:

Echo $PATH

Ieșirea va arăta cam așa:

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

Dacă aveți două fișiere executabile cu același nume situate în două directoare diferite, shell-ul va rula fișierul care se află în directorul care vine primul în $PATH.

Adăugarea unui director la $PATH

Există situații în care este posibil să doriți să adăugați alte directoare variabilei dvs. $PATH. De exemplu, unele programe pot fi instalate în locații diferite sau poate doriți să aveți un director dedicat pentru intrările dvs. personale, dar să le puteți rula fără a specifica calea absolută către executabile. Pentru a face acest lucru, trebuie doar să adăugați directorul în $PATH.

Să presupunem că aveți un director numit bin situat în directorul dvs. de acasă unde vă stocați scripturile shell. Pentru a adăuga un director la variabila dvs. $PATH:

Comanda de export exportă variabila modificată în mediile copil ale proceselor shell.

Acum puteți rula scripturile prin simpla introducere a numelui scriptului executabil fără a specifica calea completă către fișierul executabil.

Cu toate acestea, această modificare este temporară și afectează doar sesiunea shell curentă.

Pentru a face schimbarea permanentă, trebuie să definiți o variabilă $PATH în fișierele de configurare a shell-ului. Pe majoritatea distribuțiilor Linux, la pornirea unei noi sesiuni, variabilele de mediu sunt citite din următoarele fișiere:

  • Fișierele globale de configurare a shell-ului, cum ar fi /etc/environment și /etc/profile. Utilizați acest fișier dacă doriți ca un director nou să fie adăugat la $PATH al tuturor utilizatorilor de sistem.
  • Fișiere de configurare pentru shell-uri individuale de utilizator. De exemplu, dacă utilizați Bash, puteți seta variabila $PATH în fișierul ~/.bashrc, iar dacă utilizați Zsh, numele fișierului este ~/.zshrc.

În acest exemplu, vom seta o variabilă în fișierul ~/.bashrc. Deschideți fișierul într-un editor de text și adăugați următoarea linie la sfârșit:

Nano ~/.bashrc

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

Salvați fișierul și încărcați noua valoare $PATH în sesiunea curentă de shell folosind:

Sursa ~/.bashrc

Pentru a confirma că directorul a fost adăugat cu succes, imprimați valoarea lui $PATH tastând:

Echo $PATH

Concluzie

Adăugarea de noi directoare utilizatorului sau global $PATH este destul de simplă. Acest lucru vă permite să rulați comenzi și scripturi stocate în locații non-standard fără a fi nevoie să introduceți calea completă către executabil.

Aceleași instrucțiuni se aplică oricărei distribuții Linux, inclusiv , CentOS, RHEL, Debian și Linux Mint.

Simțiți-vă liber să lăsați un comentariu dacă aveți întrebări.

Ce este? Multe dintre comenzile pe care le introduceți la promptul de comandă necesită utilizarea unui program extern care este încărcat din sistemul de fișiere. De exemplu, comenzi precum mkdir și wc se află de fapt în folderul /bin.

Când introduceți o instrucțiune pe care shell-ul Bash nu o recunoaște, încearcă să o execute ca program și returnează o eroare dacă nu găsește un program cu acest nume. Și acest lucru se aplică nu numai comenzilor de bază pe care le-am uitat, deoarece din linia de comandă puteți rula orice program.


Dar cum, dacă este prezent în sistemul de fișiere, Linux știe ce programe să ruleze din ce directoare? Sistemul de operare folosește o variabilă de mediu de sistem pentru a specifica un subset de foldere de căutat atunci când se primește o comandă necunoscută. Această variabilă se numește PATH și poate fi afișată cu următoarea comandă echo (este necesar simbolul $):

Echo $PATH

Ieșirea acestei comenzi va arăta ca următoarele șapte căi absolute ale folderelor, separate prin două puncte:

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

Ori de câte ori introduceți o comandă necunoscută, Linux va căuta prin fiecare dintre folderele specificate în variabila de mediu în ordinea în care au fost specificate, încercând să găsească un program cu același nume. Dacă programul este găsit, acesta rulează; în caz contrar, este afișat un mesaj de eroare. Dar nu va fi o greșeală dacă îți cumperi inelele de argint iubite cadou. Argintul va decora orice femeie!

Aceste șapte foldere oferă acces ușor la toate programele majore din sistemul de operare, inclusiv . Orice program din afara acestor șapte foldere nu poate fi lansat prin simpla introducere a numelui lor în linia de comandă.

De exemplu, ați descărcat utilitarul jurnal de pe Internet în folderul de acasă. Dacă îi introduceți numele la promptul de comandă, veți primi un mesaj de eroare deoarece se află într-un folder care nu este inclus în calea sistemului. Pentru a rula acest program, introduceți următoarea linie (rețineți că simbolul ~ este prescurtarea folderului dvs. de acasă):

Dacă l-ați salvat într-un folder în afara căii specificate, va trebui să introduceți calea absolută și numele fișierului pentru a rula utilitarul.

Desigur, se presupune că jurnalul este un program simplu de sine stătător care nu necesită instalare, deoarece majoritatea aplicațiilor majore vor plasa fișierul executabil al programului undeva în calea specificată în timpul procesului de instalare. Ca aceasta Variabila de mediu PATH, bucură-te de el pentru sănătatea ta!

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 sistemele Unix îl instalează 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>

Î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ă):

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 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ă la 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ă programul care apelează script-ul face acest lucru prin includerea în loc de apelare, 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, 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 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 î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 la o cale fără a-mi face griji cu privire la duplică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, în caz contrar cuvântul este înlocuit.

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.

Variabile de mediu ( variabila de mediu) sunt folosite pentru a stoca valori variabile comune în diferite scripturi și programe. Astfel de variabile pot fi setate pentru un timp, de exemplu, pentru perioada de funcționare a unui shell de terminal specific, sau pentru perioada unei sesiuni de utilizator, sau puteți seta o variabilă de mediu la nivel global - pentru întregul sistem.

Variabile de mediu

$HOME
Variabila conține calea către directorul principal al utilizatorului curent. $USER
Nume de utilizator curent $PATH
Listă de directoare pentru shell pentru a căuta programe executabile. $PWD
Calea către directorul de lucru curent (sau pwd). Exemplu: dir_path=$(pwd) . $SHELL
Interpret implicit $RANDOM
Generează un număr aleator 0..32767 de fiecare dată când este accesată o variabilă. $SECOND
Timp în sec. din momentul în care porniți shell-ul de comandă. $? Rezultatul comenzii anterioare. $HOSTNAME
Numele computerului $HISTFILE
Calea către fișierul istoric al interpretului $IFS
Lista de caractere separatoare de comenzi, parametri, elemente de matrice (implicit: spațiu, tab, linie nouă) $PS1
Șablon șir prompt pentru interpret.

Setarea temporară a unei variabile de mediu

Setarea unei variabile de mediu pentru perioada de sesiune:

# Pentru un nou proces env varname=valoare [comandă] # Pentru shell-ul curent și toate subprocesele sale export varname=valoare [comandă]

Valoarea variabilei este reținută până când sistemul este repornit.

Setarea unei valori constante

Variabilele de mediu la nivel de sistem sunt setate prin fișierul /etc/environment:

ENVIRONMENT="dev"

Setarea unei variabile de mediu specifice utilizatorului prin fișierul ~/.bashrc sau ~/.bash_profile:

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

Atenţie!

Fișierul ~/.bash_profile va fi executat când interpretul este pornit cu comutatorul -l. Acest fișier nu poate fi citit când sunteți autentificat local!

De asemenea, trebuie să rețineți că modificările vor intra în vigoare numai după repornirea sesiunii!

Vizualizarea valorii unei variabile de mediu

Pentru a vizualiza valoarea unei variabile de mediu, există comanda printenv:

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

#shell, #bash, #mediu

Cele mai bune articole pe această temă