Většina technologické komunity ráda komunikuje se systémy prostřednictvím rozhraní příkazového řádku (CMD) nebo shellu. Obecně jim to usnadňuje práci. Můžete například vytvořit shellový příkaz, který dokáže automaticky provést několik úloh, na rozdíl od nutnosti proklikávat se několika tlačítky grafického uživatelského rozhraní (GUI).
Při spuštění shellu nebo programu CMD se shromáždí několik informací. Tyto informace určují, jak program přistupuje k podkladovým systémovým prostředkům, a také jeho celkové chování. Můžete je uložit na místo zvané prostředí (environment). Prostředí se skládá z řetězců, které představují páry klíč-hodnota. V tomto návodu budeme používat Ubuntu 20.04 VPS jako příklad, který vás provede nastavením proměnných prostředí nebo shellu. Tento návod by měl platit i pro ostatní distribuce Linuxu.
Jaký je rozdíl mezi proměnnými prostředí a proměnnými shellu?
Při spuštění relace se shromáždí informace z nastavení a konfiguračních souborů systému’. Ty jsou pak k dispozici procesu shellu a jeho podřízeným procesům. Tyto informace jsou sadou párů klíč-hodnota v tomto formátu:
|
1 2 3 |
KEY=value KEY="Some value" KEY=data1:data2 |
Názvy proměnných, tj. klíče, rozlišují velká a malá písmena. Podle konvence se však píší VELKÝMI PÍSMENY. Pomáhá to je odlišit v jiných kontextech. Pomocí dvojtečky ‘:’ můžete stejné proměnné přiřadit více hodnot. Je také důležité zajistit, aby kolem znaku = nezůstala mezera. Klíče jsou proměnné a dělí se do dvou skupin: proměnné prostředí a proměnné shellu. Proměnné prostředí obsahují všechny proměnné definované v rámci celého systému a jsou k dispozici všem podřízeným shellům nebo procesům. Pomáhají předávat informace do procesů, které spouštíte pomocí příkazů shellu. Proměnné shellu zahrnují pouze proměnné definované v konkrétní relaci shellu. Dále zahrnují pouze proměnné dostupné výhradně v rámci dané instance shellu.
Výpis proměnných prostředí a shellu
Ve výchozím nastavení poskytuje terminál dva příkazy pro výpis proměnných prostředí a shellu: env nebo printenv. Ve svém výchozím stavu zobrazují stejné informace. Zde je ukázka výstupu z těchto příkazů:
Použití env:

Použití printenv:

Jak vidíte, výstup je stejný. Rozdíl nastává, když chcete získat hodnotu konkrétního klíče. V takovém případě použijete printenv s názvem proměnné:

Chcete-li zobrazit více hodnot, můžete příkazu printenv předat více než jeden argument. Hodnoty se zobrazí v pořadí, v jakém jste argumenty zadali:

K zobrazení hodnoty proměnné můžete také použít příkaz echo s názvem proměnné:

Příkaz env umožňuje upravit prostředí, ve kterém se programy spouštějí, předáním definic proměnných v syntaxi jako:
|
1 |
env VAR1="var 1 value" command_to_run command_options |
To vám umožňuje přepsat hodnoty nebo nastavit nové hodnoty, které může použít podřízený proces. Příkazy printenv and env vypisují proměnné prostředí, jak je vidět výše. Ty již byly pro systémové procesy definovány. Pokud chcete vidět seznam proměnných shellu, můžete použít příkaz set. Zadáním příkazu set bez jakýchkoli proměnných se vrátí seznam všech proměnných prostředí, proměnných shellu, lokálních proměnných a funkcí shellu:

Proměnných může být příliš mnoho. V případě potřeby je můžete stránkovat pomocí příkazu:
|
1 |
set | less |
Výstup můžete dále vyčistit tím, že určíte, aby se příkaz set spustil v režimu POSIX, čímž se nevytisknou funkce shellu. Zde jej spouštíme v subshellu (samostatné instanci příkazového procesoru), abychom zabránili příkazu změnit aktuální prostředí:
|
1 |
(set -o posix; set) |
Výše uvedené vypisuje všechny příkazy prostředí a shellu dostupné v systému. Výstup můžete zredukovat pomocí následujícího příkazu, abyste se pokusili získat pouze proměnné shellu:
|
1 |
comm -23 <(set -o posix; set | sort) <(env | sort) |
Příklad výstupu z výše uvedeného příkazu je:

Ačkoli příkaz může obsahovat několik proměnných prostředí, pomůže vám rozlišit mezi proměnnými shellu a proměnnými prostředí. Je to proto, že příkaz set dává hodnoty proměnných do uvozovek, zatímco příkazy printenv a env hodnoty do uvozovek nedávají. Proměnné shellu jsou užitečné pro nastavení trvalých hodnot pro relace, aniž by se změny trvale zapisovaly do souborů.
Běžné proměnné prostředí
USER – Aktuálně přihlášený uživatel.
SHELL – Shell, který bude interpretovat zadávané příkazy. Výchozí je bash, ale můžete to změnit.
HOME – Domovský adresář aktuálního uživatele.
TERM – Určuje typ emulovaného terminálu. Zobrazuje aktuální emulovaný terminál.
PWD – Aktuální pracovní adresář.
OLDPWD – Předchozí pracovní adresář. To pomáhá shellu přepnout do předchozího adresáře, když zadáte příkaz pro změnu adresáře jako cd.
EDITOR – Výchozí editor souborů, když v terminálu zadáte edit.
LS_COLORS – Definuje barevné kódy používané k přidání barevného výstupu při zadání příkazu ls. Pomáhá rozlišovat typy souborů a poskytovat informace uživatelům.
LOGNAME – Jméno aktuálního uživatele.
MAIL – Definuje cestu k poštovní schránce aktuálního uživatele.
LANG – Definuje aktuální nastavení národního prostředí.
PATH – Určuje seznam adresářů, které se mají prohledávat při spouštění příkazů. Během provádění příkazu systém prohledává tyto adresáře a použije první nalezený spustitelný soubor.
_ – Poslední spuštěný příkaz.
Běžné proměnné shellu:
BASH_VERSION – Verze bashe v lidsky čitelném výstupu.
BASH_VERSINFO – Verze bashe ve strojově čitelném výstupu.
BASHOPTS – Seznam voleb, které byly použity při spuštění bashe. Užitečné pro zjištění, zda bude prostředí shellu fungovat podle očekávání.
COLUMNS – Počet sloupců šířky používaných k vykreslení výstupu na obrazovce.
DIRSTACK – Zásobník adresářů, které jsou k dispozici s příkazy pushd a popd.
HOSTNAME – Název hostitele počítače v tomto okamžiku.
HISTFILESIZE – Počet řádků historie příkazů uložených v souboru.
HISTSIZE – Počet řádků historie příkazů povolených v paměti.
IFS – Interní oddělovač polí pro oddělení vstupu na příkazovém řádku. Ve výchozím nastavení je to mezera.
SHELLOPTS-Používá se k nastavení voleb shellu.
UID-UID aktuálního uživatele.
PS1– Definice primární výzvy příkazového řádku. Používá se k definování toho, jak vypadá vaše výzva při spuštění relace shellu.
PS2 – Deklaruje sekundární výzvy pro případ, kdy příkaz přesahuje více řádků.
Nastavení proměnných prostředí a shellu
Nejprve, jak bylo vysvětleno dříve, budeme názvy proměnných psát velkými písmeny. Dále si projdeme vytváření proměnných shellu. Nakonec budeme vytvářet proměnné prostředí.
Vytváření proměnných shellu
Začněme obvyklým hello world. Do terminálu zadejte následující:
|
1 |
MY_FIRST_VAR=’Hello World!’ |
Uvozovky jsou použity proto, že proměnná obsahuje mezeru. Všimněte si, že jsme použili jednoduché uvozovky, protože vykřičník je speciální znak a měl by být buď escapován, nebo uzavřen do jednoduchých uvozovek. Nyní jste vytvořili svou první proměnnou shellu. Je k dispozici pouze v aktuální relaci shellu. Proměnné shellu nejsou k dispozici pro podřízené shelly a procesy. Můžete ji vypsat do terminálu pomocí příkazu set s grepem:

Nebo zobrazte hodnotu pomocí echo s odkazem pomocí znaku $ a názvu proměnné:

Pokud se pokusíte o výpis pomocí printenv, nezobrazí se žádný výstup. To vám pomůže potvrdit, že se nejedná o proměnnou prostředí:

Vytváření proměnných prostředí
Dříve vytvořenou proměnnou shellu lze převést na proměnnou prostředí pomocí příkazu export. Nejprve vytvoříte proměnnou shellu. Poté, abyste vytvořili proměnnou prostředí, musíte použít příkaz export. Po spuštění tohoto příkazu bude proměnná k dispozici pro podřízené shelly a procesy:
|
1 |
export MY_FIRST_VAR |
Nyní, pokud provedete test pomocí příkazu printenv, měli byste vidět proměnnou a hodnotu:

Proměnnou prostředí můžete také vytvořit v jednom kroku pomocí syntaxe:
|
1 |
export MY_SECOND_VAR='Toto je moje druhá proměnná' |
Proměnné prostředí se předávají pouze podřízeným shellům a nikoli nadřazenému. To pomáhá zabránit tomu, aby podřízené procesy ovlivňovaly prostředí programu, který je spustil.
Změna na běžné proměnné a rušení proměnných
Pokud jste postupovali podle návodu až do této chvíle, máte stále definovanou proměnnou MY_FIRST_VAR jako proměnnou prostředí. Můžete ji změnit zpět na proměnnou shellu zadáním příkazu echo s příznakem –n:
|
1 |
export -n MY_FIRST_VAR |
Pokud provedete test pomocí printenv, neuvidíte žádný výstup. Příkaz echo ji však zobrazí, protože se stále jedná o proměnnou shellu:

Pomocí příkazu unset můžete zrušit nastavení proměnné shellu i proměnné prostředí. A pomocí příkazu echo můžete potvrdit, že již neexistuje. Jak vidíte, nezobrazuje žádný výstup:

Nastavení proměnných prostředí při přihlášení
Mnoho programů závisí při svém spuštění na proměnných prostředí. Vzhledem k tomu, že není efektivní nastavovat proměnné pokaždé, když chcete spustit program, Linux poskytuje způsob, jak je definovat a uložit do souboru. Tímto způsobem mohou být nastaveny automaticky při přihlášení. Shell čte různé konfigurační soubory v závislosti na tom, jak je relace spuštěna. Ty jsou popsány níže:
Typy relací shellu a jejich rozdíly
- Přihlašovací relace shellu (Login Shell Session) – začíná autentizací uživatele. Relace se nastaví, když se přihlásíte přes SSH nebo relaci terminálu.
- Nepřihlašovací relace shellu (Non-login Shell Session) – začíná, když spustíte nový shell z vašeho již ověřeného shellu. Nový shell můžete spustit pomocí příkazu bash. Nejsou vyžadovány žádné přihlašovací údaje.
- Interaktivní relace shellu (Interactive Shell Session) – relace shellu připojená k relaci terminálu.
- Neinteraktivní relace shellu (Non-interactive Shell Session) – relace shellu, která není připojena k relaci terminálu – běží na pozadí.
Relace se klasifikuje buď jako přihlašovací (login) nebo nepřihlašovací (non-login), a buď jako interaktivní (interactive) nebo neinteraktivní (non-interactive). Když se přihlásíte a zahájíte relaci shellu přes SSH, bude se jednat o přihlašovací a interaktivní relaci shellu. Když spustíte skript v terminálu, obvykle běží v nepřihlašovací a neinteraktivní relaci. Relace shellu může být také kombinací obou. Který konfigurační soubor se tedy vybere?
Přihlašovací relace nejprve načte konfigurační soubory z adresáře /etc/profile. Poté zkontroluje specifické konfigurační soubory uživatele v jeho domovském adresáři. Načte se pouze první nalezený soubor z ~/.bash_profile, ~/.bash_login a ~/.profile a všechny ostatní soubory jsou ignorovány. Nepřihlašovací relace nejprve načte soubor /etc/bash.bashrc, následovaný ~/.bashrc. Neinteraktivní relace čtou proměnnou prostředí s názvem BASH_ENV, aby získaly název souboru, který se má použít k definování nového prostředí.
Implementace proměnných prostředí
Při nastavování proměnných si na základě naší výše uvedené diskuse vždy poznamenejte, do kterého souboru je umísťujete. To vám poskytne flexibilitu tím, že zajistíte, aby určité proměnné byly dostupné pouze v určitých relacích. Nechcete, aby v jedné relaci chyběla klíčová proměnná.
V některých případech chceme, aby proměnná existovala v přihlašovacích i nepřihlašovacích relacích. Většina distribucí Linuxu má naštěstí ve výchozím nastavení nakonfigurované přihlašovací konfigurace tak, aby načítaly nepřihlašovací konfigurace a zpřístupnily je vašim procesům. Proto můžete své proměnné jednoduše definovat v nepřihlašovacích konfiguračních souborech. Obvykle nastavujeme proměnné prostředí specifické pro uživatele a chceme, aby naše nastavení byla dostupná v přihlašovacích i nepřihlašovacích relacích shellu. Z tohoto důvodu použijeme soubor ~/.bashrc. K úpravě souboru použijeme nano. Pro otevření souboru zadejte do terminálu následující:
|
1 |
nano ~/.bashrc |
V otevřeném konfiguračním souboru již můžete vidět několik proměnných. Proměnné prostředí můžete přidat stejným způsobem, jako to děláte při použití příkazového řádku. Stačí zadat příkaz:
|
1 |
export KEYNAME=hodnota. |
Můžete je přidat kamkoli do souboru – na nový řádek a ne uvnitř funkce cyklu. Poté soubor uložte a zavřete. Jakákoli další relace shellu, kterou spustíte, bude číst z tohoto souboru. Pokud chcete, aby aktuální shell načetl nastavení, které jste právě přidali, aniž byste jej museli restartovat, můžete použít příkaz:
|
1 |
source ~/.bashrc |
Globální proměnné prostředí systému byste měli přidat do některého z následujících souborů: /etc/profile, /etc/bash.bashrc nebo /etc/environment.
Shrnutí
Na závěr nyní můžete nastavovat proměnné shellu a prostředí a užívat si obrovskou sílu, kterou tyto nástroje přinášejí vašemu VPS! Má to mnoho výhod, jako je automatizace spouštění některých procesů nebo konfigurace automatického nasazení, která vyžaduje autentizační údaje, předávání proměnných dceřiným procesům a další. Proměnné prostředí vám mimo jiné pomáhají skrýt citlivá data, jako jsou přihlašovací údaje, před veřejnými repozitáři. S těmito základy můžete vytvářet složité skripty, které můžete spouštět automaticky přes příkazový řádek bez nutnosti neustálého vstupu uživatele.
Příjemnou práci s počítačem!
Komentáře
Zatím žádné komentáře. Buďte první.