Premenné prostredia

Cieľ

Chcem zobraziť ale aj správne nastaviť premenné prostredia či už pre jediného konkrétneho užívateľa, alebo pre všetkých užívateľov a to aj v prostredí operačných systémov z rodiny Linux a aj v prostredí MS Windows.


Riešenie

Linux

Zobrazenie premenných v Linuxe

Zobraziť všetky premenné prostredia aj s ich hodnotami:

printenv

# alebo
env

Alebo môžem zobraziť len hodnotu konkrétnej premennej:

printenv NAZOV_PREMENNEJ

# alebo aj
echo $NAZOV_PREMENNEJ

# konkrétne napríklad
printenv PATH

# premennú PATH, ale prehľadnejšie
printenv PATH | tr ":" "\n"

Zobraziť názvy všetkých vyexportovaných premenných prostredia:

compgen -e

# alebo aj s ich hodnotami
export -p

Zobraziť len názvy všetkých premenných v danej inštancii shellu:

compgen -v

Zobraziť všetky premenné, ktorých názov začína napríklad s písmenom B:

echo ${!B*}

# alebo aby sa zobrazili prehľadnejšie v stĺpci pod sebou
echo ${!B*} | tr " " "\n"

Nastavenie premenných v Linuxe

Nastaviť premennú prostredia môžem deklarovaním mena premennej a priradením hodnoty a následne môžem vykonať export premennej ak je to potrebné, respektíve môžem priamo nastaviť export deklarovanej premennej:

x="42"
export x

export NAZOV_PREMENNEJ=hodnota_premennej

V prípade potreby môžem premennú prostredia vymazať:

unset NAZOV_PREMENNEJ

Týmto spôsobom nastavené premenné prostredia sú však dostupné len v práve bežiacom prostredí shellu, prípadne v ďalších z neho spustených inštanciách shellu (ak boli vyexportované). Čiže v ďalších pred tým spustených kópiách príkazového interpretera sú nedostupné a s ukončením behu shellu v ktorom boli deklarované/vyexportované sa stratia.

Ak potrebujem nastaviť premenné prostredia, ktoré budú dostupné trvalo a vo všetkých spustených kópiách, zapíšem ich do konfiguračného súboru .bashrc (Debian, Ubuntu, RHEL), .zshrc (pre používateľov zsh) prípadne .profile alebo .bash_profile (RHEL a spol.) v domovskom adresári užívateľa. Aby sa zmeny prejavili, a premenné boli dostupné musím sa odhlásiť a opätovne prihlásiť do systému, alebo znovu načítať daný konfiguračný súbor:

# v bashi built-in 'source'
source ~/.bashrc

Alebo v shelloch kompatibilných s POSIX, môžem na znovu načítanie konfiguračných súborov použiť built-in bodka :

. ~/.bash_profile

Premenné prostredia, ktoré majú byť dostupné globálne, pre všetkých užívateľov zapíšem do konfiguračného súboru /etc/profile, ten je spúšťaný pri každom prihlasovaní sa do systému (cez konzolu, SSH, atď.).

Ešte správnejšie a bezpečnejšie je tieto premenné deklarovať / exportovať v špecializovaných súboroch s koncovkou .sh v adresári /etc/profile.d.

sudo sh -c 'echo export NAZOV_PREMENNEJ="HODNOTA_PREMENNEJ" \
>> /etc/profile.d/pre_vsetkych_uzivatelov.sh'

Na zápis do konfiguračných súborov v adresári /etc potrebujem administrátorské oprávnenie.

Premenné prostredia môžem odstrániť vymazaním záznamu z konfiguračného súboru.

Premenná prostredia môže byt deklarovaná ako nemenná a teda hodnotu takto deklarovanej premennej nemožno meniť a premennú nemožno ani odstrániť pomocou unset. V súlade s normou POSIX je možné použiť len príkaz readonly - ma predvolene globálny dosah, aj keď bude použitý vo vnútri funkcie. Bash ešte pridáva ďalší príkaz declare .

readonly pi="3.1415927"

# alebo postupne
TMOUT=900
readonly TMOUT
export TMOUT

# alebo v bashi built-in 'declare' s voľbou '-r'
declare -r X="42"

# a s globálnym dosahom, voľba '-g', ak je použité vo vnútri funkcie
declare -rg X="42"

Windows

Zobrazenie premenných vo Windows

Zobraziť všetky premenné prostredia aj s ich hodnotami:

ls env:

# alebo
Get-ChildItem Env:

# alebo to isté ešte raz, ale kratšie
gci env:

Alebo len konkrétnu premennú:

$env:path

# premennú PATH, ale prehľadnejšie
$env:path -split ";"

Alebo zobraziť všetky premenné prostredia podľa neúplného názvu, môžem použiť zástupný znak hviezdička (wild card):

get-item -path env:\user*

Zobraziť všetky premenné (nie len premenné prostredia) aj s ich hodnotami

ls variable:

Nastavenie premenných vo Windows

Nastaviť premennú prostredia môžem aj ako akúkoľvek inú premennú, priradením hodnoty:

$env:nazov_premennej = 'hodnota premennej'

# napríklad pridanie novej cesty
$env:PATH = 'C:\bin;' + %PATH%

Keďže premenná prostredia nesmie byť bez hodnoty, zmazať ju môžem priradením prázdneho reťazca:

$env:nazov_premennej = ''

Manipulovať s premennými prostredia môžem tiež pomocou príkazov na manipuláciu so súbormi:

new-item -path env:\nazov_premennej -value 'hodnota premennej'
copy-item -path env:\nazov_premennej -destination env:nazov_inej -passthru
set-item -path env:\nazov_premennej -value 'ina hodnota'
get-item -path env:\nazov_premennej
remove-item -path env:\nazov_premennej -verbose

Takto nastavené premenné prostredia sú dostupné len v prostredí tej kópie PowerShellu v ktorej boli vytvorené a len dočasne do jej ukončenia.

Ak chcem nastaviť premenné prostredia trvalo a so širšou platnosťou aj pre ďalšie kópie PowerShellu (nie len pre práve bežiacu), použijem metódy z triedy Environment Class:

[Environment]::SetEnvironmentVariable('nazov_premennej', 'hodnota', 'pôsobnosť')

Pôsobnosť (scope) môže byť:

  • Machine – najširšia pôsobnosť, platí pre celý spustený operačný systém, premenné sú dostupné pre všetky spustené procesy, na zadanie je potrebné mať administrátorské oprávnenie
  • User – platí pre všetky procesy spustené užívateľom
  • Process – kombinácia oboch

Premenné s tým istým menom, ale s užšou pôsobnosťou majú vyššiu prioritu. Ak nezadám pôsobnosť, premenná prostredia bude platná len v práve bežiacom procese a len do jeho ukončenia.

Pomocou ďalšej metódy triedy môžem zobraziť hodnotu premennej prostredia:

[Environment]::GetEnvironmentVariable('nazov_premennej')

# napr. PATH v PowerShell nainštalovanom v Debiane
[Environment]::GetEnvironmentVariable('PATH') -split ":"

Premennú prostredia môžem tiež vymazať pomocou metódy triedy, priradením prázdneho reťazca:

[Environment]::SetEnvironmentVariable('nazov_premennej', '', 'pôsobnosť')

Zdroj