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=valoaresă seteze variabila în shell-ul curent: efectul ține doar cât rulează comanda. Pentru shell-ul curent foloseșteexport. - Scrierea mai multor argumente în linia
#!/usr/bin/env python3 -ufă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.