Postoji više različitih tipova varijabli okruženja u Linux sistemu. U ovom tekstu, istražićemo kako da ih pregledate, kreirate za lokalne i udaljene sesije, i obezbedite da budu sačuvane nakon ponovnog pokretanja.
Kako funkcionišu varijable okruženja
Kada otvorite terminal i pokrenete komandnu liniju unutar njega, sistem koristi skup varijabli kako bi osigurao da je okruženje ispravno podešeno. Ove varijable omogućavaju da sve neophodne informacije budu dostupne terminalu i komandnoj liniji. Zajedno, ove varijable definišu izgled i podešavanja terminala, uključujući i samu komandnu liniju. Iz tog razloga, one se nazivaju varijablama okruženja.
Neke varijable okruženja su sistemske, ili globalne, dok su druge vezane za sesiju i vidljive su samo vama. Drugi korisnici ne mogu pristupiti vašim varijablama sesije. Postoji i treća kategorija varijabli koje se definišu unutar same komandne linije. Vaša podešavanja lokacije, vremenske zone, rasporeda tastature, liste direktorijuma koje se pretražuju za komande, i podrazumevani editor, sve je smešteno u varijablama okruženja komandne linije.
Pokazaćemo vam kako da pregledate varijable okruženja koje postoje na vašem sistemu, kao i kako da kreirate sopstvene. Takođe, objasnićemo kako da ih učinite dostupnim podređenim procesima i kako da budu sačuvane nakon ponovnog pokretanja sistema.
Okruženje i nasleđivanje
Kada se komandna linija pokrene, ona prolazi kroz fazu inicijalizacije, tokom koje čita varijable okruženja koje definišu njeno okruženje.
Kada se iz te komandne linije pokrene program ili komanda (poznati kao podređeni procesi), oni nasleđuju okruženje svog roditeljskog procesa. Međutim, važno je napomenuti da je moguće kreirati varijable koje se ne dodaju okruženju, pa ih podređeni procesi ne nasleđuju.
Ako je podređeni proces takođe komandna linija, ona će se inicijalizovati sa sopstvenim, svežim skupom varijabli. To znači da promene u komandnoj liniji roditeljske sesije neće biti nasleđene od strane podređene komandne linije.
Globalne varijable okruženja
Po konvenciji, imena varijabli okruženja se pišu velikim slovima. Evo nekih globalnih varijabli i značenja njihovih vrednosti:
SHELL
: Naziv komandne linije koja se koristi prilikom otvaranja terminala. U većini Linux distribucija, ovo je Bash, osim ako nije promenjeno.
TERM
: Terminali su, u suštini, emulacije hardverskih terminala. Ova varijabla sadrži tip hardverskog terminala koji se emulira.
USER
: Korisničko ime trenutnog korisnika.
PWD
: Puna putanja trenutnog radnog direktorijuma.
OLDPWD
: Direktorijum u kojem ste bili pre prelaska u trenutni radni direktorijum.
LS_COLORS
: Lista kodova boja koje koristi ls
komanda za označavanje različitih tipova datoteka.
MAIL
: Ako je sistem e-pošte podešen na Linux računaru (što nije podrazumevano), ova varijabla sadrži putanju do poštanskog sandučeta trenutnog korisnika.
PATH
: Lista direktorijuma u kojima komandna linija traži izvršne komande.
LANG
: Podešavanja jezika, lokalizacije i kodiranja znakova.
HOME
: Početni direktorijum trenutnog korisnika.
_
: Varijabla okruženja sa imenom donja crta (_
) sadrži poslednju unetu komandu.
Možemo prikazati vrednosti ovih varijabli koristeći komandu echo
, koja ispisuje vrednosti u terminalu. Da biste videli vrednost varijable okruženja, potrebno je da dodate znak dolara ($
) ispred njenog imena.
Pomoću automatskog popunjavanja (Tab taster), možete brzo uneti ime varijable okruženja. Unesite nekoliko početnih slova, pritisnite Tab, i komandna linija će automatski dovršiti ime varijable. Ako to ne funkcioniše, unesite još nekoliko slova kako bi se ime varijable razlikovalo od drugih komandi sa sličnim početkom:
echo $SHELL
echo $LANG
echo $HOME
echo $PWD
Da biste kreirali sopstvene globalne varijable okruženja, dodajte ih u datoteku /etc/environment
. Biće vam potrebna root privilegija (sudo
) za izmenu ove datoteke:
sudo gedit /etc/environment
Da biste dodali varijablu okruženja, unesite njeno ime, znak jednakosti (=
) i vrednost koju treba da sadrži. Ne stavljajte razmake pre ili posle znaka jednakosti. Ime varijable može da sadrži slova, donje crte (_
) ili brojeve, s tim da prvi znak ne sme biti broj.
Ako vrednost sadrži razmake, celu vrednost stavite unutar navodnika ("
).
Nakon što sačuvate izmene, odjavite se i ponovo prijavite. Koristite komandu echo
da proverite da li nova varijabla postoji i sadrži ispravnu vrednost:
echo $WEBSITE
Pošto je to globalna varijabla i dostupna svim korisnicima, korisnik ‘mari’ može pristupiti ovoj varijabli nakon sledeće prijave:
echo $WEBSITE
Da biste prikazali sve varijable okruženja odjednom, koristite komandu printenv
. Pošto je izlaz obiman, preusmerite ga na komande sort
i less
:
printenv | sort | less
Na ovaj način, dobićete sortiranu listu varijabli okruženja u programu less
.
Izlaz komande printenv
možete preusmeriti na komandu grep
da biste tražili varijable koje se odnose na određenu temu:
printenv | grep GNOME
Varijable okruženja komandne linije
Ovo su neke od varijabli okruženja komandne linije koje se koriste u Bash-u da diktiraju ili beleže njegovo ponašanje i funkcionalnosti. Neke vrednosti se ažuriraju dok koristite terminal. Na primer, varijabla COLUMNS
se menja kada promenite širinu prozora terminala:
BASHOPTS
: Opcije komandne linije koje su korišćene prilikom pokretanja Bash-a.
BASH_VERSION
: Broj verzije Bash-a, kao niz reči i brojeva.
BASH_VERSINFO
: Bash verzija, kao numerička vrednost.
COLUMNS
: Trenutna širina prozora terminala.
DIRSTACK
: Direktorijumi koji su dodati na stog direktorijuma pomoću komande pushd
.
HISTFILESIZE
: Maksimalan broj linija dozvoljenih u datoteci istorije.
HISTSIZE
: Broj dozvoljenih linija istorije u memoriji.
HOSTNAME
: Ime računara (host).
IFS
: Interni separator polja, koji se koristi za razdvajanje unosa u komandnoj liniji. Podrazumevano, to je razmak.
PS1
: Varijabla PS1
sadrži definiciju primarnog, podrazumevanog, prompta komandne linije. U definiciju se mogu uključiti tokeni, poznati kao ‘escape sequences’, koji predstavljaju informacije kao što su ime hosta, korisničko ime, trenutni radni direktorijum i vreme.
PS2
: Kada komanda zahteva unos u više redova, prikazuje se sekundarni prompt. Varijabla PS2
sadrži definiciju ovog prompta, koji je, podrazumevano, znak veće od (>
).
SHELLOPTS
: Opcije komandne linije koje se mogu podesiti pomoću komande set
.
UID
: Identifikator korisnika (User ID) trenutnog korisnika.
Hajde da proverimo neke od ovih varijabli komandne linije:
echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID
Za potpunost, evo tokena koje možete koristiti u definicijama komandne linije:
\t
: Trenutno vreme, u formatu HH:MM:SS.
\d
: Trenutni datum, u obliku dan u nedelji, mesec, datum.
\n
: Znak za novi red.
\s
: Ime vaše komandne linije.
\W
: Ime vašeg trenutnog radnog direktorijuma.
\w
: Puna putanja do vašeg trenutnog radnog direktorijuma.
\u
: Korisničko ime prijavljenog korisnika.
\h
: Ime računara (host).
\#
: Svaka komanda se broji unutar sesije komandne linije. Ovo vam omogućava da vidite redni broj komande. Ovaj broj se razlikuje od broja koji komanda ima u listi istorije.
\$
: Prikazuje znak dolara ($
) za običnog korisnika, ili tarabu (#
) za root korisnika. Ovo se zasniva na proveri UID korisnika. Ako je UID nula, korisnik je root.
Definiciju vaše PS1
varijable okruženja naći ćete u datoteci .bashrc
.
Kreiranje varijabli okruženja sesije
Da biste kreirali varijable okruženja koje će biti dostupne samo vama, dodajte ih na kraj vaše .bashrc
datoteke. Ukoliko želite da ove varijable budu dostupne i udaljenim sesijama, kao što su SSH veze, takođe ih morate dodati u .bash_profile
datoteku.
Format definicije varijabli je isti u obe datoteke. Da biste dodali definiciju u .bashrc
datoteku, koristite sledeću komandu u vašem početnom direktorijumu:
gedit .bashrc
Dodali smo varijablu okruženja pod nazivom INHERITED_VAR
. Obratite pažnju na reč export
na početku reda.
Nakon što završite sa izmenama, sačuvajte i zatvorite datoteku. Možete se odjaviti i ponovo prijaviti, ili možete naterati komandnu liniju da ponovo pročita .bashrc
datoteku pomoću komande tačka (.
):
. .bashrc
Sada, kreirajmo varijablu okruženja direktno u komandnoj liniji:
LOCAL_VAR="This session only"
Ako koristimo komandu echo
, videćemo da su nam obe varijable dostupne:
echo $LOCAL_VAR
echo $INHERITED_VAR
Primetićete da je definicija varijable INHERITED_VAR
počinjala sa rečju export
. To znači da će ovu varijablu nasleđivati podređeni procesi trenutne komandne linije. Ako pokrenemo novu podređenu komandnu liniju pomoću komande bash
, i ponovo proverimo ove dve varijable, videćemo da je situacija drugačija:
bash
echo $LOCAL_VAR
echo $INHERITED_VAR
Kao što vidite, INHERITED_VAR
je dostupna u podređenoj komandnoj liniji, dok LOCAL_VAR
nije. Dobijamo prazan red.
Iako export
dodaje varijablu okruženja u okruženje koje nasleđuju podređeni procesi, INHERITED_VAR
nije globalna varijabla. Na primer, korisnik ‘mari’ ne može joj pristupiti:
echo $INHERITED_VAR
Da bismo zatvorili podređenu Bash sesiju, koristimo komandu exit
:
exit
Nasleđivanje okruženja utiče i na skripte. Evo jednostavne skripte koja ispisuje vrednosti tri naše varijable okruženja u terminal:
#!/bin/bash echo "WEBSITE" $WEBSITE echo "LOCAL_VAR" $LOCAL_VAR echo "INHERITED_VAR" $INHERITED_VAR
Ova skripta je sačuvana u datoteci pod nazivom envtest.sh
, a zatim učinjena izvršnom:
chmod +x envtest.sh
Kada pokrenemo skriptu, ona ima pristup dvema od tri varijable:
./envtest.sh
Skripta može da vidi globalnu varijablu WEBSITE
i izvezenu varijablu INHERITED_VAR
. Ne može pristupiti varijabli LOCAL_VAR
, iako se skripta izvršava u istoj komandnoj liniji u kojoj je ova varijabla kreirana.
Ako je neophodno, možemo da izvezemo varijablu okruženja iz komandne linije. Uradimo to za LOCAL_VAR
, pa ponovo pokrenimo skriptu:
export LOCAL_VAR
./envtest.sh
Varijabla je dodata u okruženje trenutne komandne linije, i samim tim pojavljuje se u okruženju koje je skripta nasledila. Sada skripta može pristupiti ovoj varijabli.
Udaljene konekcije
Globalne varijable okruženja su dostupne i tokom udaljenih sesija, ali ako želite da vaše lokalno definisane varijable budu dostupne udaljenim vezama, morate ih dodati u .bash_profile
datoteku. Moguće je podesiti istu varijablu u .bashrc
i .bash_profile
, sa različitim vrednostima. Na taj način, skripte bi, na primer, mogle da promene svoje ponašanje u zavisnosti od toga da li se korisnik prijavljuje lokalno ili udaljeno.
(Postoji i .profile
datoteka, koja takođe može sadržati definicije varijabli. Međutim, .profile
se ne čita ukoliko postoji datoteka .bash_profile
. Stoga je sigurnije, i u skladu sa Bash-om, koristiti datoteku .bash_profile
.)
Da bismo izmenili .bash_profile
datoteku, ponovo ćemo koristiti gedit
:
gedit .bash_profile
Dodajmo istu varijablu sa istom vrednošću kao i ranije.
Sačuvajte izmene i zatvorite gedit
.
Sa drugog računara, napravićemo SSH vezu sa test računarom:
ssh [email protected]
Kada se povežemo, ponovo ćemo pokrenuti skriptu:
./envtest.sh
Datoteka .bash_profile
je pročitana tokom inicijalizacije udaljene prijave, i varijabla INHERITED_VAR
je dostupna i nama i skripti.
Poništavanje varijable okruženja
Da biste poništili varijablu, koristite komandu unset
. Ako poništimo globalnu varijablu WEBSITE
, kao i izvezenu varijablu INHERITED_VAR
, one više neće biti dostupne ni u komandnoj liniji, niti podređenim procesima:
unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE
Treba napomenuti da ovo menja dostupnost globalnih varijabli samo za vašu sesiju. Drugi korisnik koji je istovremeno prijavljen, i dalje će moći da pristupi svojoj kopiji te varijable. Njegova instanca je inicijalizovana i učitana iz /etc/environment
datoteke tokom procesa prijave, i nezavisna je od vaših izmena.
Na primer, korisnik ‘mari’ i dalje ima pristup varijabli WEBSITE
i može pročitati njenu vrednost, iako je korisnik ‘dave’ poništio u svojoj sesiji:
echo $WEBSITE
Upravljanje okruženjem
Varijable okruženja omogućavaju skriptama i aplikacijama da znaju kako treba da se ponašaju. Mogu se koristiti za čuvanje podešavanja ili manjih količina podataka. Na primer, skripta može popuniti okruženje vrednošću koju druge skripte mogu referencirati, bez potrebe za pisanjem podataka u datoteku.