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ávnenieUser
– platí pre všetky procesy spustené užívateľomProcess
– 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ť')