V operačním systému Linux existuje více typů proměnných prostředí. Seznamte se s možnostmi jejich zobrazení, vytváření pro lokální i vzdálené přihlášení a s metodami, jak zajistit jejich trvalé uchování po restartu systému.
Jak fungují proměnné prostředí?
Při spuštění terminálového okna a s ním i příkazového řádku, se využívá kolekce proměnných, které zajišťují správnou konfiguraci prostředí. Tyto proměnné také zpřístupňují veškeré informace, které může terminálové okno a příkazový řádek potřebovat. Společně tyto proměnné obsahují nastavení definující prostředí, od vzhledu příkazové řádky až po chování celého terminálu. Proto se o nich hovoří jako o proměnných prostředí.
Některé proměnné prostředí mají celosystémovou platnost, tedy jsou globální. Jiné jsou specifické pro konkrétní relaci a jsou viditelné pouze pro vás. Ostatní nemohou odkazovat na proměnné prostředí vaší relace. V rámci příkazového řádku je definována třetí skupina proměnných prostředí. Vaše regionální nastavení, časové pásmo, konfigurace klávesnice, seznam adresářů prohledávaných při hledání příkazů a váš preferovaný textový editor – to vše je uloženo v proměnných prostředí příkazového řádku.
Ukážeme vám, jak zobrazit proměnné prostředí existující ve vašem systému a jak si vytvořit vlastní. Také vám představíme způsoby, jak je zpřístupnit podřízeným procesům a jak zajistit, aby zůstaly zachovány po restartu systému.
Prostředí a dědičnost
Při spuštění příkazového řádku prochází inicializační fází. Během této fáze se načítají proměnné prostředí, které definují jeho konfiguraci.
Když je z příkazového řádku spuštěn program nebo příkaz – označovaný jako podřízený proces – dědí prostředí svého nadřazeného procesu. Nicméně, jak uvidíme, je možné vytvářet proměnné, které se do prostředí nepřidávají, a tak je podřízený proces nezdědí.
Pokud je podřízeným procesem opět příkazový řádek, inicializuje se z vlastní, nové sady proměnných. Pokud tedy změníte příkazovou řádku v aktuálním příkazovém řádku a následně spustíte podřízený příkazový řádek, podřízený nezdědí upravenou příkazovou řádku z nadřazeného prostředí.
Globální proměnné prostředí
Podle konvence se proměnné prostředí zapisují velkými písmeny. Níže jsou uvedeny některé z globálních proměnných prostředí a vysvětlení hodnot, které obsahují:
SHELL
: Název příkazového řádku, který se spustí při otevření terminálu. Ve většině distribucí Linuxu to bude bash, pokud jste ho nezměnili z výchozího nastavení.TERM
: Terminálová okna jsou ve skutečnosti emulace hardwarového terminálu. Tato proměnná udává typ hardwarového terminálu, který se emuluje.USER
: Uživatelské jméno aktuálně přihlášeného uživatele.PWD
: Cesta k aktuálnímu pracovnímu adresáři.OLDPWD
: Adresář, ve kterém jste byli před přesunem do aktuálního pracovního adresáře.LS_COLORS
: Seznam barevných kódů, které používá příkaz ls pro zvýraznění různých typů souborů.MAIL
: Pokud je na vašem počítači s Linuxem nastaven poštovní systém (ve výchozím nastavení není), bude zde cesta k poštovní schránce aktuálního uživatele.PATH
: Seznam adresářů, ve kterých příkazový řádek vyhledává spustitelné soubory příkazů.LANG
: Nastavení jazyka, lokalizace a kódování znaků.HOME
: Domovský adresář aktuálního uživatele._
: Proměnná prostředí podtržítko (_) obsahuje poslední zadaný příkaz.
Můžeme zjistit, jaké hodnoty jsou uloženy v těchto proměnných pomocí jednoduchého příkazu echo
, který vypíše hodnoty do terminálu. Pro zobrazení hodnoty proměnné prostředí je nutné před její název přidat znak dolaru ($).
Můžete využít funkci automatického dokončování, které vám ušetří psaní. Zadejte několik písmen jména proměnné prostředí a stiskněte Tab. Příkazový řádek automaticky doplní zbytek názvu. Pokud se tak nestane, budete muset napsat více písmen, aby se proměnná prostředí odlišila od jiných příkazů se stejným začátkem:
echo $SHELL
echo $LANG
echo $HOME
echo $PWD
Chcete-li vytvořit vlastní globální proměnné prostředí, přidejte je do souboru /etc/environment
. K úpravě tohoto souboru budete potřebovat práva správce (sudo):
sudo gedit /etc/environment
Pro přidání proměnné prostředí zadejte její název, rovnítko (=) a hodnotu, kterou má proměnná uchovávat. Nedělejte mezery před ani za rovnítkem. Název proměnné prostředí může obsahovat písmena, podtržítko (_) nebo číslice. První znak jména však nesmí být číslice.
Pokud hodnota obsahuje mezery, uzavřete celou hodnotu do uvozovek (“).
Uložte soubor a odhlaste se a znovu přihlaste. Pomocí příkazu echo
ověřte, zda nová proměnná existuje a má vámi nastavenou hodnotu:
echo $WEBSITE
Protože se jedná o globální proměnnou prostředí, která je dostupná pro všechny, může se na ni uživatelka Mary odkazovat po dalším přihlášení:
echo $WEBSITE
Pro zobrazení všech proměnných prostředí najednou zadejte příkaz printenv
. Výstup je velmi dlouhý, takže má smysl jej filtrovat pomocí příkazů sort
a less
:
printenv | sort | less
Seřazený seznam proměnných prostředí se zobrazí v programu less
.
Můžeme také použít příkaz grep
pro vyhledání proměnných prostředí souvisejících s určitým tématem.
printenv | grep GNOME
Proměnné prostředí příkazového řádku
Následují některé z proměnných prostředí příkazového řádku používaných v prostředí bash
, které řídí nebo zaznamenávají jeho chování a funkčnost. Některé hodnoty se aktualizují při používání terminálu. Například proměnná prostředí COLUMNS
se aktualizuje, aby odrážela změny v šířce okna terminálu:
BASHOPTS
: Možnosti příkazového řádku použité při spuštění bash
.BASH_VERSION
: Číslo verze bash
jako řetězec slov a číslic.BASH_VERSINFO
: Verze bash
jako číslice.COLUMNS
: Aktuální šířka okna terminálu.DIRSTACK
: Adresáře, které byly přidány do zásobníku adresářů příkazem pushd
.HISTFILESIZE
: Maximální počet řádků povolených v souboru s historií.HISTSIZE
: Počet řádků historie povolených v paměti.HOSTNAME
: Název hostitele počítače.IFS
: Interní oddělovač polí používaný k oddělování vstupu na příkazovém řádku. Ve výchozím nastavení je to mezera.PS1
: Proměnná prostředí PS1
obsahuje definici primární, výchozí a příkazové řádky. Do definice příkazové řádky lze zahrnout sadu tokenů nazývaných únikové sekvence. Ty reprezentují například hostitele a uživatelské jméno, aktuální pracovní adresář a čas.PS2
: Pokud příkaz zabírá více než jeden řádek a očekává se více vstupu, zobrazí se sekundární příkazová řádka. Proměnná prostředí PS2
obsahuje definici této sekundární výzvy, která je ve výchozím nastavení znakem větší než (>).SHELLOPTS
: Možnosti příkazového řádku, které můžete nastavit pomocí možnosti set
.UID
: Identifikátor uživatele aktuálního uživatele.
Podívejme se na hodnoty některých z těchto proměnných:
echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID
Pro úplnost uvádíme tokeny, které lze použít v definicích příkazové řádky:
\t
: Aktuální čas ve formátu HH:MM:SS.\d
: Aktuální datum vyjádřené jako den v týdnu, měsíc, datum.\n
: Znak nového řádku.\s
: Název vašeho shellu.\W
: Název vašeho aktuálního pracovního adresáře.\w
: Cesta k vašemu aktuálnímu pracovnímu adresáři.\u
: Uživatelské jméno přihlášené osoby.\h
: Název hostitele počítače.\#
: Každý příkaz v příkazovém řádku je očíslován. Toto vám umožňuje zobrazit číslo příkazu v příkazové řádce. Toto není stejné jako číslo, které bude mít příkaz v seznamu historie.\$
: Nastaví koncový znak výzvy na znak dolaru ($) pro běžného uživatele a znak hash (#) pro uživatele root. Funguje tak, že zkontroluje UID uživatele. Pokud je nula, uživatel je root.
Definici proměnné prostředí PS1
najdete ve svém souboru .bashrc
.
Vytváření proměnných prostředí relace
Chcete-li vytvořit proměnné prostředí pro vlastní použití, přidejte je na konec souboru .bashrc
. Pokud chcete, aby byly proměnné prostředí dostupné pro vzdálené relace, například pro připojení SSH, je nutné je přidat i do souboru .bash_profile
.
Formát definice proměnné prostředí je pro oba soubory stejný. Pro přidání definice do souboru .bashrc
zadejte do svého domovského adresáře:
gedit .bashrc
Přidali jsme proměnnou prostředí s názvem INHERITED_VAR
. Všimněte si slova „export“ na začátku řádku.
Po dokončení úprav soubor uložte a zavřete. Můžete se odhlásit a znovu přihlásit, nebo můžete shell donutit znovu načíst soubor .bashrc
pomocí příkazu tečka (.
) následujícím způsobem:
. .bashrc
Nyní vytvoříme proměnnou prostředí přímo v příkazovém řádku:
LOCAL_VAR="Pouze pro tuto relaci"
Pomocí příkazu echo
můžeme ověřit, že jsou obě proměnné prostředí dostupné:
echo $LOCAL_VAR
echo $INHERITED_VAR
Všimněte si, že definice proměnné prostředí INHERITED_VAR
měla na začátku řádku slovo „export“. To znamená, že proměnná prostředí bude zděděna podřízenými procesy aktuálního shellu. Pokud spustíme další bash
pomocí příkazu bash
, můžeme znovu zkontrolovat dvě proměnné z podřízeného shellu:
bash
echo $LOCAL_VAR
echo $INHERITED_VAR
Jak je vidět, proměnná INHERITED_VAR
je přístupná v podřízeném prostředí, ale LOCAL_VAR
nikoli. Dostáváme prázdný řádek.
Ačkoli „export“ přidává proměnnou prostředí do prostředí, které podřízené procesy zdědí, INHERITED_VAR
není globální proměnná prostředí. Uživatelka Mary se na ni například nemůže odkazovat:
echo $INHERITED_VAR
Pro ukončení naší podřízené relace bash
použijeme příkaz exit
:
exit
Dědičnost prostředí ovlivňuje i skripty. Zde je jednoduchý skript, který vypíše hodnoty našich tří proměnných prostředí do terminálu:
#!/bin/bash echo "WEBSITE" $WEBSITE echo "LOCAL_VAR" $LOCAL_VAR echo "INHERITED_VAR" $INHERITED_VAR
Tento kód byl uložen do souboru s názvem envtest.sh
a následně byl spuštěn jako spustitelný soubor pomocí příkazu:
chmod +x envtest.sh
Když skript spustíme, má přístup ke dvěma ze tří proměnných prostředí:
./envtest.sh
Skript vidí globální proměnnou prostředí WEBSITE
a exportovanou proměnnou prostředí INHERITED_VAR
. Nemá přístup k LOCAL_VAR
, i když skript běží ve stejném prostředí, kde byla tato proměnná vytvořena.
V případě potřeby můžeme exportovat proměnnou prostředí z příkazového řádku. Uděláme to s proměnnou LOCAL_VAR
a pak skript znovu spustíme:
export LOCAL_VAR
./envtest.sh
Proměnná prostředí byla přidána do prostředí aktuálního shellu, a tak se objevuje v prostředí, které je zděděno skriptem. Nyní skript může také odkazovat na tuto proměnnou prostředí.
Vzdálená připojení
Globální proměnné prostředí jsou přístupné i pro vzdálená přihlášení. Pokud chcete, aby byly vaše lokálně definované proměnné prostředí dostupné vzdáleně, je nutné je přidat do souboru .bash_profile
. V souborech .bashrc
a .bash_profile
můžete nastavit stejnou proměnnou prostředí s různými hodnotami. Tohoto je možno využít například ve skriptu, který upraví své chování v závislosti na tom, zda se uživatel připojuje lokálně nebo vzdáleně.
(Pro úplnost je zde také soubor .profile
. Může také obsahovat definice proměnných prostředí. Soubor .profile
se však nenačte, pokud je přítomen soubor .bash_profile
. Nejbezpečnější způsob – a způsob kompatibilní s bash
– je tedy používat soubor .bash_profile
.)
Pro úpravu souboru .bash_profile
opět použijeme gedit
:
gedit .bash_profile
Přidáme stejnou proměnnou prostředí se stejnou hodnotou, jakou jsme použili dříve.
Uložte změny a zavřete gedit
.
Na jiném počítači vytvoříme SSH připojení k testovacímu počítači.
ssh [email protected]
Jakmile jsme připojeni, spustíme skript ještě jednou:
./envtest.sh
Soubor .bash_profile
byl načten při inicializaci vzdáleného přihlášení a proměnná prostředí INHERITED_VAR
je přístupná pro nás i pro skript.
Zrušení nastavení proměnné prostředí
Pro zrušení nastavení proměnné prostředí použijte příkaz unset
. Pokud zrušíme nastavení globální proměnné prostředí WEBSITE
a exportované proměnné prostředí INHERITED_VAR
, nebudou již dostupné v příkazovém řádku ani v podřízených procesech:
unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE
Je důležité poznamenat, že toto mění pouze dostupnost globálních proměnných prostředí pro vás v této relaci. Jiná osoba, která je přihlášená současně, bude mít stále přístup ke své instanci této globální proměnné prostředí. Její instance byla inicializována a načtena ze souboru /etc/environment
během procesu přihlášení a je nezávislá na kopii proměnné kohokoli jiného.
Například uživatelka Mary může stále přistupovat k proměnné prostředí WEBSITE
a číst její hodnotu, i když uživatel Dave ve své relaci její nastavení zrušil:
echo $WEBSITE
Význam proměnných prostředí
Proměnné prostředí lze využít ke sdělení skriptům a aplikacím, jak se mají chovat. Lze je využít k uchování nastavení nebo malého množství dat. Skript může například naplnit prostředí hodnotou, na kterou se mohou odkazovat jiné skripty, aniž by bylo nutné je zapisovat do souboru.