Jak nastavit proměnné prostředí v Bash na Linuxu

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.