env în Linux / Bash

Discuri și sistem GNU coreutils

Afișează variabilele de mediu sau rulează o comandă cu un mediu modificat, fără să schimbe shell-ul curent.

Sintaxă comandă
env [opțiuni] [NUME=valoare...] [comandă [argumente...]]

Ce face env

Rulată singură, env afișează toate variabilele de mediu ale sesiunii, câte una pe rând, în forma NUME=valoare (la fel ca printenv, care poate afișa și o singură variabilă: printenv HOME). Utilitatea ei principală este însă alta: rulează o comandă cu variabile adăugate, eliminate sau cu un mediu complet gol, iar shell-ul tău rămâne neschimbat.

Cea mai cunoscută folosire este în prima linie a scripturilor: #!/usr/bin/env bash sau #!/usr/bin/env python3. Astfel interpretorul este căutat în PATH, iar scriptul merge și pe sistemele unde Bash sau Python nu sunt în /bin sau /usr/bin.

Opțiuni și argumente

Opțiune / Parametru Descriere
NUME=valoare Setează variabila doar pentru comanda rulată.
-i, --ignore-environment Pornește comanda cu un mediu gol (doar variabilele date explicit).
-u, --unset NUME Elimină variabila din mediul comenzii.
-C, --chdir DIR Rulează comanda în alt director.
-S, --split-string Împarte un șir în mai multe argumente; permite opțiuni în linia #! (ex. #!/usr/bin/env -S python3 -u).

Exemple

Exemplul 1: Un mediu complet gol, cu doar două variabile

Cu -i, comanda env pornită din interior vede doar variabilele pe care le-am dat.

env -i ORAS=Iași NUME=Ana env

Rezultat

ORAS=Iași
NUME=Ana

Exemplul 2: Variabile doar pentru o comandă

NUME există doar pentru bash-ul pornit de env; în shell-ul curent rămâne nesetat. Cu -u ascundem o variabilă exportată, de exemplu un token.

env NUME=Ana bash -c 'echo "Salut, $NUME"'
echo "În shell-ul curent: NUME=${NUME:-nesetat}"
export TOKEN=secret
env -u TOKEN bash -c 'echo "TOKEN=${TOKEN:-lipsă}"'

Rezultat

Salut, Ana
În shell-ul curent: NUME=nesetat
TOKEN=lipsă

Exemplul 3: Linia #!/usr/bin/env în scripturi

Scriptul își caută interpretorul în PATH prin env, apoi îl rulăm direct.

cat > salut.sh <<'EOF'
#!/usr/bin/env bash
echo "Salut din Iași!"
EOF
chmod +x salut.sh
./salut.sh

Rezultat

Salut din Iași!

Greșeli frecvente

  • Așteptarea ca env VAR=valoare să seteze variabila în shell-ul curent: efectul ține doar cât rulează comanda. Pentru shell-ul curent folosește export.
  • Scrierea mai multor argumente în linia #!/usr/bin/env python3 -u fără -S: nucleul transmite tot textul ca un singur argument și env nu găsește comanda „python3 -u”.

Comenzi înrudite

  • export: Transformă o variabilă de shell într-o variabilă de mediu (environment variable) accesibilă proceselor copil.
  • Variabile în Bash: Declararea, atribuirea, valorile implicite și expandarea corectă a variabilelor în Bash.
  • source: Execută comenzile dintr-un fișier direct în contextul shell-ului curent, păstrând variabilele și funcțiile.
  • ulimit: Afișează și setează limitele de resurse ale shell-ului: fișiere deschise, procese, mărimea fișierelor core.