Recent am observat că avem 3 opțiuni pentru a seta variabilele de mediu:
-
export envVar1=1
-
setenv envVar2=2
-
env envVAr3=3
Dacă există și alte modalități, vă rugăm să ne lămuriți.
Când ar trebui să prefer una peste alta? Vă rugăm să sugerați instrucțiuni.
În ceea ce privește compatibilitatea shell, care este cea mai extinsă (acoperă mai multe dialecte shell)?
Am observat deja acest lucru răspuns , dar doresc să extind întrebarea cu env
și reguli de preferință pentru utilizare.
Răspuns
export VARIABLE_NAME="some value"
este modalitatea de a seta o variabilă de mediu în orice shell compatibil POSIX (sh
, dash
, bash
, ksh
etc .; și zsh). Dacă variabila are deja o valoare, puteți utiliza export VARIABLE_NAME
pentru a o transforma într-o variabilă de mediu fără a-i modifica valoarea.
Pre-POSIX Shell-urile Bourne nu au acceptat acest lucru, motiv pentru care veți vedea scripturi care evită export VARIABLE_NAME="some value"
și veți utiliza VARIABLE_NAME="some value"; export VARIABLE_NAME
în schimb. Dar shell-urile Bourne pre-POSIX sunt extrem de rare în zilele noastre.
setenv VARIABLE_NAME="some value"
este sintaxa csh pentru a seta o variabilă de mediu. setenv
nu există în sh, iar csh este extrem de rar folosit în scripturi și a fost depășit de bash pentru utilizare interactivă în ultimii 20 de ani (și zsh chiar și mai mult), așa că puteți uita de el dacă nu îl întâlnești.
Comanda env
este foarte rar utilă, cu excepția liniilor shebang . Când este invocat fără argumente, afișează mediul, dar export
o face mai bine (sortat și adesea citat la disambigua te linii noi în valori de linii noi care separă valorile). Când este invocat cu argumente, rulează o comandă cu variabile de mediu suplimentare, dar funcționează aceeași comandă fără env
(VAR=value mycommand
rulează mycommand
cu VAR
setat la value
, la fel ca env VAR=value mycommand
). Motivul env
este util în linia shebang este că efectuează căutare PATH
și se întâmplă să nu facă nimic altceva atunci când este invocat cu o comandă Nume. Comanda env
poate fi utilă pentru a rula o comandă cu doar câteva variabile de mediu cu -i
sau fără parametri pentru a afișa mediul, inclusiv variabile cu nume nevalide pe care shell-ul nu le importă.
Răspuns
Setarea unei variabile precum VAR="asdf"
lasă mediul nemodificat, ceea ce înseamnă că programele pe care le lansați în aceeași sesiune nu vor ști nimic despre VAR
și nu vor putea să îl acceseze. Doriți acest comportament atunci când scrieți scripturi shell .
export
, pe de altă parte, este un bazin încorporat care modifică mediul, făcând astfel variabila exportată vizibilă pentru procesele secundare generate în sesiunea curentă. poate realiza același lucru rulând VAR="asdf" %program_name%
.
env
nu este un program încorporat, ci un program în sine. suprafața funcționează exact ca atunci când VAR="asdf" %program_name%
, dar la nivelul inferior lucrurile devin un pic mai complicate. Mai întâi, se lansează env
. Modifică mediul, apoi execută comanda cu argumente date. Același comportament pe care îl poți atinge în propriul tău cod folosind apelul de sistem exec (3) .
setenv
este doar export
în cochilii csh-family, așa cum se menționează în răspunsul dvs.
Comentarii
Răspuns
Există mai multe întrebări cu răspunsuri care răspund la acest lucru:
-
Diferența dintre variabilele shell care sunt exportate și cele care nu sunt în bash
-
Care este diferența de utilizare între variabilele shell și variabilele de mediu?
(etc.)
VAR=asdf
actualizează mediul dacăVAR
se afla deja în mediu. (Acest lucru nu era ' adevărat în shell-ul Bourne original.)