Care este diferența dintre env, setenv, export și când se folosește?

Recent am observat că avem 3 opțiuni pentru a seta variabilele de mediu:

  1. export envVar1=1
  2. setenv envVar2=2
  3. 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

  • În shell-urile moderne, VAR=asdf actualizează mediul dacă VAR se afla deja în mediu. (Acest lucru nu era ' adevărat în shell-ul Bourne original.)

Răspuns

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *