În Linux, există mai multe tipuri de variabile de mediu. Vom explora modul în care acestea pot fi vizualizate, create pentru sesiuni locale și de la distanță și cum pot fi menținute active chiar și după repornirea sistemului.
Înțelegerea modului de funcționare a variabilelor de mediu
Când inițiați o fereastră de terminal și interfața de comandă din interiorul acesteia, se accesează un set de variabile pentru a asigura o configurare corectă a shell-ului. Aceste variabile sunt esențiale pentru ca fereastra de terminal și shell-ul să aibă acces la informațiile necesare. Împreună, aceste variabile determină setările care definesc mediul din fereastra terminalului, inclusiv aspectul promptului de comandă. Acesta este motivul pentru care sunt denumite variabile de mediu.
Unele variabile de mediu au aplicabilitate la nivel de sistem sau sunt globale, în timp ce altele sunt specifice sesiunii curente și vizibile doar pentru utilizatorul respectiv. Există și un al treilea tip, variabilele de mediu definite direct în shell. Setările de limbă, fusul orar, configurația tastaturii, lista de directoare scanate de shell în căutarea unei comenzi, precum și editorul implicit, sunt toate stocate în variabile de mediu shell.
Vom analiza metodele de vizualizare a variabilelor de mediu existente în sistemul dumneavoastră și vom explica cum puteți crea altele noi. De asemenea, vă vom ghida în procesul de a le face accesibile proceselor secundare și de a le menține active după repornirea sistemului.
Mediul și transmiterea informațiilor
La pornirea unui shell, acesta trece printr-o fază de inițializare, unde citește variabilele de mediu care îi definesc mediul de lucru.
Când un program sau o comandă este lansată din acest shell, fiind considerat un proces copil, acesta preia mediul procesului părinte. Este crucial să rețineți că nu toate variabilele sunt automat transmise, unele fiind create exclusiv pentru procesul părinte.
Dacă procesul copil este tot un shell, acesta se va inițializa folosind propriul set de variabile. Astfel, orice modificări aduse promptului de comandă într-un shell nu vor fi preluate de un shell copil inițiat ulterior.
Variabile de mediu globale
Conform convenției, numele variabilelor de mediu sunt scrise cu majuscule. Iată câteva dintre variabilele de mediu globale și semnificația valorilor lor:
SHELL: Specificați shell-ul care este pornit când deschideți o fereastră de terminal. În majoritatea distribuțiilor Linux, acesta este bash, cu excepția cazului în care ați modificat setările implicite.
TERM: Ferestrele de terminal sunt, de fapt, emulări ale unui terminal hardware. Această variabilă specifică tipul de terminal hardware emulat.
USER: Numele de utilizator al persoanei care utilizează sistemul în prezent.
PWD: Calea către directorul de lucru actual.
OLDPWD: Directorul în care vă aflați înainte de a naviga la directorul de lucru curent.
LS_COLORS: Codurile de culoare folosite de comanda ls pentru a evidenția diferitele tipuri de fișiere.
MAIL: Dacă sistemul de e-mail este configurat pe computerul dumneavoastră Linux (ceea ce nu este implicit), această variabilă păstrează calea către căsuța poștală a utilizatorului curent.
PATH: O listă de directoare pe care shell-ul le scanează în căutarea fișierelor executabile de comandă.
LANG: Setările de limbă, localizare și codificare a caracterelor.
HOME: Directorul principal al utilizatorului curent.
_: Variabila de mediu linia de subliniere (_) conține ultima comandă introdusă.
Putem observa valorile acestor variabile folosind comanda echo, care va afisa informațiile în fereastra terminalului. Pentru a vedea valoarea unei variabile de mediu, trebuie să adăugați un simbol dolar ($) înaintea numelui ei.
O funcție utilă este completarea cu tasta Tab, care vă permite să completați automat numele variabilei de mediu. Introduceți câteva litere din nume și apăsați tasta Tab. Dacă numele nu se completează, continuați să introduceți mai multe litere pentru a diferenția variabila de alte comenzi cu nume similare.
echo $SHELL
echo $LANG
echo $HOME
echo $PWD
Pentru a crea propriile variabile de mediu globale, editați fișierul /etc/environment, folosind sudo:
sudo gedit /etc/environment
Adăugați variabila, scriind numele ei, urmat de un semn egal (=) și valoarea dorită. Nu introduceți spații înainte sau după semnul egal. Numele variabilei poate conține litere, caracterul de subliniere (_) sau cifre, dar nu poate începe cu o cifră.
Dacă valoarea include spații, utilizați ghilimele („) pentru a o încadra.
Salvați fișierul, deconectați-vă și reconectați-vă. Verificați existența și valoarea variabilei noi cu echo:
echo $WEBSITE
Deoarece este o variabilă globală, utilizatorul Mary va avea acces la ea după autentificare:
echo $WEBSITE
Pentru a vizualiza toate variabilele de mediu simultan, utilizați comanda printenv. Pentru o vizualizare mai clară, filtrați rezultatele cu sort și less:
printenv | sort | less
Lista sortată este afișată în less.
Putem folosi grep pentru a căuta variabilele de mediu legate de un anumit subiect.
printenv | grep GNOME
Variabile de mediu Shell
Aceste variabile sunt folosite în bash pentru a controla comportamentul și funcționalitatea shell-ului. Unele valori sunt actualizate pe măsură ce utilizați terminalul. De exemplu, variabila COLUMNS se modifică în funcție de lățimea ferestrei terminalului:
BASHOPTS: Opțiunile din linia de comandă utilizate la pornirea bash.
BASH_VERSION: Versiunea bash ca text.
BASH_VERSINFO: Versiunea bash ca număr.
COLUMNS: Lățimea actuală a ferestrei terminalului.
DIRSTACK: Directoarele care au fost adăugate la stiva de directoare prin comanda pushd.
HISTFILESIZE: Numărul maxim de linii permise în fișierul istoric.
HISTSIZE: Numărul de linii de istorie stocate în memorie.
HOSTNAME: Numele computerului.
IFS: Separatorul intern de câmpuri folosit pentru a delimita intrările din linia de comandă. Implicit, acesta este un spațiu.
PS1: Variabila PS1 definește aspectul promptului de comandă. Aceasta poate include secvențe de evacuare care reprezintă informații precum numele gazdei, directorul curent și ora.
PS2: Când o comandă se întinde pe mai multe linii, este afișat promptul secundar, a cărui definiție este stocată în variabila PS2. Implicit, acesta este simbolul „>”.
SHELLOPTS: Opțiunile shell care pot fi setate cu opțiunea set.
UID: Identificatorul de utilizator curent.
Să analizăm câteva dintre aceste variabile shell:
echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID
Pentru a completa informația, iată secvențele care pot fi folosite în definițiile promptului de comandă:
t: Ora curentă, în format HH:MM:SS.
d: Data curentă, sub forma zi a săptămânii, lună, zi.
n: Un caracter de linie nouă.
s: Numele shell-ului.
W: Numele directorului curent.
w: Calea completă a directorului curent.
u: Numele de utilizator.
h: Numele gazdei.
#: Numărul comenzii în shell. Nu este același cu numărul comenzii din istoricul comenzilor.
$: Afișează simbolul dolar ($) pentru utilizatorii normali și simbolul diez (#) pentru utilizatorul root. Acest lucru se realizează verificând UID-ul utilizatorului. Dacă este zero, utilizatorul este root.
Definiția variabilei de mediu PS1 se află în fișierul .bashrc.
Crearea variabilelor de mediu de sesiune
Pentru a crea variabile de mediu personalizate, adăugați definițiile lor la sfârșitul fișierului .bashrc. Pentru ca variabilele să fie disponibile și în sesiunile de la distanță, cum ar fi conexiunile SSH, acestea trebuie adăugate și în fișierul .bash_profile.
Formatul definiției variabilei este identic în ambele fișiere. Pentru a adăuga o definiție în fișierul .bash_profile, introduceți următoarea comandă în directorul dumneavoastră principal:
gedit .bashrc
Am adăugat variabila de mediu INHERITED_VAR. Observați cuvântul „export” de la începutul liniei.
Salvați și închideți fișierul. Vă puteți deconecta și reconecta, sau puteți forța shell-ul să citească fișierul .bash_profile cu comanda punct (.):
. .bashrc
Acum, vom crea o variabilă de mediu direct în linia de comandă:
LOCAL_VAR="Această sesiune este privată"
Folosind echo, putem verifica dacă ambele variabile sunt accesibile:
echo $LOCAL_VAR
echo $INHERITED_VAR
Rețineți că variabila INHERITED_VAR a fost definită cu cuvântul „export”, ceea ce o face accesibilă proceselor copil ale shell-ului curent. Dacă inițiem un alt shell cu comanda bash, putem verifica din nou cele două variabile:
bash
echo $LOCAL_VAR
echo $INHERITED_VAR
După cum se vede, INHERITED_VAR este accesibilă în shell-ul copil, dar LOCAL_VAR nu. LOCAL_VAR este afișată ca o linie goală.
Deși „export” transmite variabila de mediu proceselor copil, INHERITED_VAR nu este o variabilă globală. Spre exemplu, utilizatorul Mary nu are acces la ea:
echo $INHERITED_VAR
Pentru a închide sesiunea child bash, folosim comanda exit:
exit
Transmiterea informațiilor mediului afectează și scripturile. Iată un exemplu de script simplu care afișează valorile celor trei variabile de mediu:
#!/bin/bash echo "WEBSITE" $WEBSITE echo "LOCAL_VAR" $LOCAL_VAR echo "INHERITED_VAR" $INHERITED_VAR
Scriptul a fost salvat ca envtest.sh și a fost făcut executabil cu următoarea comandă:
chmod +x envtest.sh
La rularea scriptului, acesta poate accesa două dintre cele trei variabile de mediu:
./envtest.sh
Scriptul poate accesa variabila globală WEBSITE și variabila exportată INHERITED_VAR, dar nu și LOCAL_VAR, deși rulează în același shell în care aceasta a fost creată.
Dacă este necesar, putem exporta o variabilă de mediu direct din linia de comandă. Vom face acest lucru cu LOCAL_VAR și apoi vom rula din nou scriptul:
export LOCAL_VAR
./envtest.sh
Variabila de mediu a fost adăugată mediului shell-ului curent, fiind astfel transmisă scriptului. Astfel, scriptul are acum acces la ea.
Conexiuni de la distanță
Variabilele de mediu globale sunt accesibile sesiunilor de conectare de la distanță. Dacă doriți ca variabilele locale să fie disponibile de la distanță, trebuie să le adăugați în fișierul .bash_profile. Este posibil să setați aceeași variabilă de mediu în .bashrc și .bash_profile, cu valori diferite. Acest lucru permite ca scripturile să-și modifice comportamentul în funcție de faptul că utilizatorul este conectat local sau de la distanță.
(Pentru a evita confuziile, rețineți că există și un fișier .profile, care poate conține definiții ale variabilelor de mediu. Totuși, fișierul .profile nu este citit dacă există fișierul .bash_profile. Cel mai sigur mod de a gestiona aceste variabile este prin intermediul fișierului .bash_profile.)
Pentru a edita fișierul .bash_profile, folosim gedit:
gedit .bash_profile
Vom adăuga aceeași variabilă cu aceeași valoare pe care am folosit-o anterior.
Salvați modificările și închideți gedit.
De pe un alt computer, vom realiza o conexiune SSH la computerul de testare.
ssh [email protected]
După ce ne-am conectat, vom rula scriptul:
./envtest.sh
Fișierul .bash_profile a fost citit ca parte a inițializării autentificării de la distanță, iar variabila de mediu INHERITED_VAR este accesibilă, atât nouă, cât și scriptului.
Eliminarea unei variabile de mediu
Pentru a elimina o variabilă de mediu, utilizați comanda unset. Dacă eliminăm variabila globală WEBSITE și variabila exportată INHERITED_VAR, acestea nu vor mai fi disponibile în linia de comandă și nici în procesele copil:
unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE
Important de reținut este că această modificare afectează disponibilitatea variabilelor globale doar pentru sesiunea curentă. Un alt utilizator, conectat simultan, va putea în continuare accesa instanța sa a acelei variabile globale. Instanța lui a fost inițializată și citită din fișierul /etc/environment în timpul procesului său de conectare și este independentă de modificările făcute de alții.
De exemplu, utilizatorul Mary poate accesa în continuare variabila WEBSITE și poate citi valoarea sa, chiar dacă utilizatorul dave a eliminat-o în sesiunea lui:
echo $WEBSITE
Controlul mediului
Variabilele de mediu pot fi folosite pentru a indica scripturilor și aplicațiilor modul în care ar trebui să se comporte. Pot fi folosite pentru a stoca setări sau cantități mici de date. De exemplu, un script poate popula mediul cu o valoare care poate fi accesată de alte scripturi, fără a mai fi necesară scrierea acesteia într-un fișier.