Cum să setați variabilele de mediu în Bash pe Linux

Există mai mult de un tip de variabilă de mediu pe Linux. Aflați cum să le vedeți, să le creați pentru conectări locale și de la distanță și să le faceți să supraviețuiască repornirilor.

Cum funcționează variabilele de mediu

Când lansați o fereastră de terminal și coaja din interiorul ei, se face referire la o colecție de variabile pentru a se asigura că shell-ul este configurat corect. Aceste variabile asigură, de asemenea, că orice informație la care ar putea avea nevoie să se refere fereastra terminalului și shell-ul este disponibilă. În mod colectiv, aceste variabile dețin setări care definesc mediul pe care îl găsiți în fereastra terminalului, până la aspectul promptului de comandă. Deci, firesc, ele sunt denumite variabile de mediu.

Unele variabile de mediu sunt la nivel de sistem sau globale. Altele sunt la nivelul întregii sesiuni și pot fi văzute numai de dvs. Alții nu pot face referire la variabilele de mediu ale sesiunii. Există un al treilea set de variabile de mediu definite în shell. Setările dvs. de localitate, fus orar și tastatură, setul de directoare căutate atunci când shell-ul încearcă să găsească o comandă și editorul dvs. implicit, toate sunt stocate în variabilele de mediu shell.

Vă vom arăta cum să vedeți variabilele de mediu care există pe sistemul dvs. și vă vom descrie cum să vă creați propria. De asemenea, vă vom arăta cum să le puneți la dispoziție proceselor secundare și să fiți perseverenți la reporniri.

Medii și moștenire

Când pornește un shell, trece printr-o fază de inițializare. În acest moment citește variabilele de mediu care definesc mediul shell-ului.

Când un program sau o comandă este lansată din acel shell – cunoscut sub numele de proces copil – moștenește mediul procesului părinte – dar ai grijă! După cum vom vedea, puteți crea variabile care nu sunt adăugate în mediul dvs., astfel încât să nu fie moștenite de un proces copil.

Dacă procesul copil este un shell, acel shell se va inițializa din propriul său set de variabile. Deci, dacă modificați promptul de comandă în shell-ul curent și apoi lansați un shell copil, shell-ul copil nu va moșteni promptul de comandă modificat al părintelui.

Variabile de mediu global

Prin convenție, variabilelor de mediu li se dau nume cu majuscule. Iată câteva dintre variabilele de mediu globale și ce reprezintă valorile pe care le conțin:

SHELL: Numele shell-ului care se va lansa când deschideți o fereastră de terminal. Pe majoritatea distribuțiilor Linux, asta va fi bash cu excepția cazului în care ați schimbat-o din valoarea implicită.
TERMEN: Ferestrele terminale sunt de fapt emulări ale unui terminal hardware. Acesta deține tipul de terminal hardware care va fi emulat.
UTILIZATOR: Numele de utilizator al persoanei curente care utilizează sistemul.
PWD: Calea către directorul de lucru curent.
OLDPWD: Directorul în care vă aflați înainte de a vă muta în directorul de lucru curent.
LS_COLORS: lista de coduri de culoare utilizate de ls evidențiați diferite tipuri de fișiere.
MAIL: Dacă sistemul de corespondență a fost configurat pe computerul dvs. Linux (în mod implicit, nu este), acesta va păstra calea către căsuța poștală a utilizatorului curent.
PATH: O listă de directoare prin care shell-ul va căuta pentru a găsi executabile de comandă.
LANG: setările de limbă, localizare și codificare a caracterelor.
HOME: Directorul principal al utilizatorului curent.
_: Variabila de mediu liniuță de subliniere (_) conține ultima comandă care a fost introdusă.

  Cum să instalați și să utilizați Stacer pe Linux

Putem vedea cum sunt setate unele dintre acestea folosind nimic mai sofisticat decât echo, ceea ce va face scrieți valorile în fereastra terminalului. Pentru a vedea valoarea deținută de o variabilă de mediu, trebuie să adăugați un semn dolar ($) la începutul numelui acesteia.

O atingere plăcută este că o poți folosi completarea filei pentru a completa numele variabilei de mediu pentru dvs. Tastați câteva litere ale numelui și apăsați pe Tab. Numele variabilei este completat de shell. Dacă acest lucru nu se întâmplă, va trebui să mai tastați câteva litere pentru a distinge variabila de mediu de alte comenzi cu nume care încep cu aceleași litere:

echo $SHELL
echo $LANG
echo $HOME
echo $PWD

Pentru a crea propriile variabile de mediu globale, adăugați-le în fișierul /etc/environment. Va trebui să utilizați sudo pentru a edita acest fișier:

sudo gedit /etc/environment

Pentru a adăuga o variabilă de mediu, introduceți numele acesteia, un semn egal (=) și valoarea pe care doriți să o păstreze variabila de mediu. Nu spația înainte sau după semnul egal (=). Numele variabilei de mediu poate conține litere, un caracter de subliniere (_) sau cifre. Cu toate acestea, primul caracter al unui nume nu poate fi un număr.

Dacă există spații în valoare, asigurați-vă că includeți întreaga valoare între ghilimele („).

Salvați fișierul, apoi deconectați-vă și reconectați-vă. Utilizați echo pentru a testa dacă o nouă variabilă există și păstrează valoarea pe care o setați:

echo $WEBSITE

Deoarece este o variabilă de mediu globală și este disponibilă pentru toată lumea, utilizatorul Mary poate face referire la variabila de mediu la următoarea conectare:

echo $WEBSITE

La vezi toate variabilele de mediu deodată, tastați printenv. Există o mulțime de rezultate, așa că este logic să o trimiți prin sortare și apoi în mai puțin:

printenv | sort | less

Lista sortată a variabilelor de mediu ne este afișată în mai puțin.

Putem canaliza ieșirea prin grep pentru a căuta variabile de mediu legate de un anumit subiect.

printenv | grep GNOME

Variabile de mediu Shell

Acestea sunt câteva dintre variabilele de mediu shell utilizate în bash pentru a dicta sau înregistra comportamentul și funcționalitatea acestuia. Unele dintre valori sunt actualizate pe măsură ce utilizați terminalul. De exemplu, variabila de mediu COLUMNS va fi actualizată pentru a reflecta modificările pe care le-ați putea face la lățimea ferestrei terminalului:

BASHOPTS: Opțiunile din linia de comandă care au fost utilizate la lansarea bash.
BASH_VERSION: numărul versiunii bash ca șir de cuvinte și numere.
BASH_VERSINFO: versiunea bash ca cifră.
COLONNE: Lățimea curentă a ferestrei terminalului.
DIRSTACK: directoarele care au fost adăugat la stiva de directoare prin comanda pushd.
HISTFILESIZE: numărul maxim de linii permise în fişier istoric.
HISTSIZE: Numărul de linii de istorie permise în memorie.
HOSTNAME: numele de gazdă al computerului.
IFS: The Separator de câmp intern folosit pentru a separa intrarea pe linia de comandă. În mod implicit, acesta este un spațiu.
PS1: variabila de mediu PS1 deține definiția pentru linia principală, implicită și promptul de comandă. Un set de jetoane numite secvențe de evacuare poate fi inclus în definiția promptului de comandă. Ele reprezintă lucruri precum gazda și numele de utilizator, directorul de lucru curent și ora.
PS2: Când o comandă se întinde pe mai mult de o linie și se așteaptă mai multe intrări, se afișează promptul de comandă secundar. Variabila de mediu PS2 deține definiția acestui prompt secundar, care, implicit, este semnul mai mare decât (>).
SHELLOPTS: Opțiuni de Shell pe care le puteți seta folosind opțiunea de setare.
UID: The Identificator de utilizator al utilizatorului actual.

  Cum să faci o copie de rezervă a instalării Linux

Să verificăm câteva dintre aceste variabile shell:

echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID

Pentru a fi complet, iată token-urile pe care le puteți folosi în definițiile promptului de comandă:

t: ora curentă, formatată ca HH:MM:SS.
d: Data curentă, exprimată ca zi a săptămânii, lună, dată.
n: un caracter de linie nouă.
s: Numele cochiliei tale.
W: Numele directorului de lucru curent.
w: Calea către directorul de lucru curent.
u: numele de utilizator al persoanei care s-a autentificat.
h: Numele de gazdă al computerului.
#: Fiecare comandă dintr-un shell este numerotată. Acest lucru vă permite să vedeți numărul comenzii în linia de comandă. Acesta nu este același cu numărul pe care comanda îl va avea în lista istorică.
$: Setează caracterul final al promptului la un semn dolar ($) pentru un utilizator obișnuit și un simbol hash (#) pentru utilizatorul root. Acest lucru funcționează prin verificarea UID-ului utilizatorului. Dacă este zero, utilizatorul este root.

Veți găsi definiția variabilei dvs. de mediu PS1 în fișierul dvs. .bashrc.

Crearea variabilelor de mediu de sesiune

Pentru a crea variabile de mediu pentru uzul dvs., adăugați-le în partea de jos a fișierului dvs. .bashrc. Dacă doriți să aveți variabilele de mediu disponibile pentru sesiunile la distanță, cum ar fi conexiunile SSH, va trebui să le adăugați și la fișierul dvs. .bash_profile.

Formatul definiției variabilei de mediu este același pentru ambele fișiere. Pentru a adăuga o definiție la fișierul dvs. .bash_profile, introduceți aceasta în directorul dvs. principal:

gedit .bashrc

Am adăugat o variabilă de mediu numită INHERITED_VAR. Notați cuvântul „export” la începutul liniei.

Salvați și închideți fișierul după ce terminați editarea. Puteți să vă deconectați și să vă reconectați din nou, sau puteți determina ca shell-ul să recitească fișierul .bash_profile folosind comanda dot (.) astfel:

. .bashrc

Acum, să creăm o variabilă de mediu pe linia de comandă:

LOCAL_VAR="This session only"

LOCAL_VAL=

Dacă folosim echo, putem vedea că ambele variabile de mediu ne sunt accesibile:

echo $LOCAL_VAR
echo $INHERITED_VAR

Veți observa că definiția variabilei de mediu INHERITED_VAR avea cuvântul „export” la începutul liniei. Aceasta înseamnă că variabila de mediu va fi moștenită de procesele copil ale shell-ului curent. Dacă lansăm alta folosind comanda bash, putem verifica din nou cele două variabile, din interiorul shell-ului copil:

bash
echo $LOCAL_VAR
echo $INHERITED_VAR

După cum puteți vedea, INHERITED_VAR este accesibil în shell-ul copil, dar LOCAL_VAR nu este. Pur și simplu obținem o linie goală.

Deși „export” adaugă partea variabilă de mediu la mediul pe care procesele copil îl moștenesc, INHERITED_VAR nu este o variabilă de mediu globală. De exemplu, utilizatorul Mary nu poate face referire la el:

echo $INHERITED_VAR

Pentru a închide sesiunea Child bash, folosim exit:

exit

Mediile moștenite afectează și scripturile. Iată un script simplu care scrie valorile celor trei variabile ale noastre de mediu în fereastra terminalului:

#!/bin/bash

echo "WEBSITE" $WEBSITE
echo "LOCAL_VAR" $LOCAL_VAR
echo "INHERITED_VAR" $INHERITED_VAR

Acesta a fost salvat într-un fișier numit envtest.sh și apoi a fost făcut executabil cu următoarele:

chmod +x envtest.sh

Când rulăm scriptul, acesta poate accesa două din trei variabile de mediu:

./envtest.sh

Scriptul poate vedea variabila de mediu globală WEBSITE și variabila de mediu exportată INHERITED_VAR. Nu poate accesa LOCAL_VAR, chiar dacă scriptul rulează în același shell în care a fost creată variabila.

  Cum să instalați și să utilizați clientul de e-mail Kube pe Linux

Dacă avem nevoie, putem exporta o variabilă de mediu din linia de comandă. Vom face asta cu LOCAL_VAR-ul nostru și apoi rulăm din nou scriptul:

export LOCAL_VAR
./envtest.sh

Variabila de mediu a fost adăugată la mediul shell-ului curent și, astfel, apare în mediul care este moștenit de script. Scriptul poate face referire și la acea variabilă de mediu.

Conexiuni la distanță

Variabilele de mediu globale sunt accesibile sesiunilor de conectare la distanță, dar dacă doriți ca variabilele de mediu definite local să fie disponibile pentru dvs. de la distanță, trebuie să le adăugați în fișierul .bash_profile. Puteți seta aceeași variabilă de mediu în fișierele .bashrc și .bash_profile, cu valori diferite. Acest lucru ar putea fi preluat de un script, de exemplu, pentru a-și modifica comportamentul pentru persoanele care folosesc sistemul local sau de la distanță.

(Cu riscul de a crea confuzie, există și un fișier .profile. Poate conține și definiții ale variabilelor de mediu. Cu toate acestea, fișierul .profile nu este citit dacă fișierul .bash_profile este prezent. Deci, cel mai sigur lucru de făcut — și modalitatea compatibilă cu bash — este să utilizați fișierul .bash_profile.)

Pentru a edita fișierul .bash_profile, vom folosi din nou gedit:

gedit .bash_profile

Vom adăuga aceeași variabilă de mediu cu aceeași valoare pe care am folosit-o înainte.

Salvați modificările și închideți gedit.

Pe alt computer, vom face un SSH conexiune la computerul de testare.

ssh [email protected]

Odată ce suntem conectați, vom rula din nou 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ă nouă și scriptului.

Anularea unei variabile de mediu

Pentru a anula o variabilă de mediu, utilizați dezactivați comanda. Dacă dezactivăm variabila de mediu globală, WEBSITE, și variabila de mediu exportată, INHERITED_VAR, acestea nu vor mai fi disponibile pe linia de comandă și nici în procesele copil:

unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE

Un punct de remarcat este că acest lucru modifică doar disponibilitatea variabilelor de mediu globale pentru dvs. în această sesiune. O altă persoană care s-a autentificat simultan va putea în continuare să acceseze instanța sa a acelei variabile de mediu globale. Instanța sa a fost inițializată și citită din fișierul /etc/environment în timpul procesului său de conectare și este independentă de copierea variabilei de către altcineva.

De exemplu, utilizatorul Mary poate accesa în continuare variabila de mediu WEBSITE și poate citi valoarea acesteia, chiar dacă utilizatorul dave a dezactivat-o în sesiunea sa:

echo $WEBSITE

Controlul mediului

Variabilele de mediu pot fi folosite pentru a informa scripturile și aplicațiile cum ar trebui să se comporte. Ele pot fi folosite pentru a stoca setări sau cantități mici de date. De exemplu, un script poate popula un mediu cu o valoare care poate fi referită de alte scripturi fără a fi nevoie să le scrieți într-un fișier.