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

V Linuxu existuje více než jeden typ proměnných prostředí. Naučte se, jak je zobrazit, vytvořit je pro místní a vzdálené přihlášení a zajistit, aby přežily restarty.

Jak fungují proměnné prostředí

Když spustíte okno terminálu a skořápka uvnitř, odkazuje se na kolekci proměnných, aby bylo zajištěno, že je shell správně nakonfigurován. Tyto proměnné také zajišťují, že jsou dostupné všechny informace, na které se může terminálové okno a shell potřebovat odkazovat. Společně tyto proměnné obsahují nastavení, která definují prostředí, které najdete v okně terminálu, až po vzhled příkazového řádku. Přirozeně se o nich mluví jako o proměnných prostředí.

Některé proměnné prostředí jsou celosystémové nebo globální. Jiné jsou pro celou relaci a můžete je vidět pouze vy. Ostatní nemohou odkazovat na vaše proměnné prostředí relace. V rámci shellu je definována třetí sada proměnných prostředí. Vaše národní prostředí, časové pásmo a nastavení klávesnice, sada adresářů prohledaných, když se shell pokusí najít příkaz, a váš výchozí editor, to vše jsou uloženy v proměnných prostředí shellu.

Ukážeme vám, jak zobrazit proměnné prostředí, které existují ve vašem systému, a popíšeme, jak vytvořit vlastní. Ukážeme vám také, jak je zpřístupnit podřízeným procesům a jak být trvalé po restartování.

Prostředí a dědičnost

Když se shell spustí, projde fází inicializace. V tomto okamžiku čte proměnné prostředí, které definují prostředí shellu.

Když je program nebo příkaz spuštěn z tohoto shellu – známého jako podřízený proces – zdědí prostředí nadřazeného procesu – ale pozor! Jak uvidíme, můžete vytvářet proměnné, které se do vašeho prostředí nepřidávají, takže je nezdědí podřízený proces.

Pokud je podřízeným procesem shell, tento shell se inicializuje ze své vlastní, čerstvé sady proměnných. Pokud tedy změníte příkazový řádek v aktuálním shellu a poté spustíte podřízený shell, podřízený shell nezdědí upravený příkazový řádek nadřazeného prostředí.

Globální proměnné prostředí

Podle konvence se proměnným prostředí přidělují názvy velkými písmeny. Zde jsou některé z globálních proměnných prostředí a co představují hodnoty, které obsahují:

SHELL: Název shellu, který se spustí, když otevřete okno terminálu. Na většině distribucí Linuxu to bude bash pokud jste jej nezměnili z výchozího nastavení.
TERM: Terminálová okna jsou ve skutečnosti emulacemi hardwarového terminálu. Toto obsahuje typ hardwarového terminálu, který bude emulován.
USER: Uživatelské jméno aktuální osoby používající systém.
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 kódů barev používaných ls zvýraznit různé typy souborů.
MAIL: Pokud byl poštovní systém nastaven na vašem počítači se systémem Linux (ve výchozím nastavení není), bude cestu k poštovní schránce aktuálního uživatele.
PATH: Seznam adresářů, které bude shell prohledávat, aby našel 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.

  5 nových vylepšení Chrome právě vytvořil Správce záložek

Můžeme vidět, na co jsou některé z nich nastaveny pomocí ničeho sofistikovanějšího než echo, což bude zapište hodnoty do okna terminálu. Chcete-li vidět hodnotu, kterou má proměnná prostředí, musíte na začátek jejího názvu přidat znak dolaru ($).

Příjemné je, že můžete použít dokončení karty k vyplnění názvu proměnné prostředí za vás. Zadejte několik písmen jména a stiskněte Tab. Název proměnné je doplněn shellem. Pokud se tak nestane, budete muset napsat několik dalších písmen, abyste odlišili proměnnou prostředí od ostatních příkazů s názvy začínajícími stejnými písmeny:

echo $SHELL
echo $LANG
echo $HOME
echo $PWD

Chcete-li vytvořit své vlastní globální proměnné prostředí, přidejte je do souboru /etc/environment. K úpravě tohoto souboru budete muset použít sudo:

sudo gedit /etc/environment

Chcete-li přidat proměnnou prostředí, zadejte její název, rovnítko (=) a hodnotu, kterou má proměnná prostředí uchovávat. Nedělejte mezery před nebo za rovnítkem (=). Název proměnné prostředí může obsahovat písmena, podtržítko (_) nebo čísla. První znak jména však nemůže být číslo.

Pokud jsou v hodnotě mezery, ujistěte se, že jste celou hodnotu uzavřeli do uvozovek (“).

Uložte soubor a poté se odhlaste a znovu přihlaste. Pomocí echo otestujte, zda existuje nová proměnná a uchovává vámi nastavenou hodnotu:

echo $WEBSITE

Protože se jedná o globální proměnnou prostředí a je dostupná všem, může uživatelka Mary při příštím přihlášení odkazovat na proměnnou prostředí:

echo $WEBSITE

Na zobrazit všechny proměnné prostředí najednou zadejte printenv. Výstupů je hodně, takže má smysl to řadit přes potrubí a pak do méně:

printenv | sort | less

Seřazený seznam proměnných prostředí se nám zobrazí méně.

Můžeme výstup přes grep hledat proměnné prostředí související s konkrétním tématem.

printenv | grep GNOME

Proměnné prostředí Shell

Toto jsou některé z proměnných prostředí shellu používaných v bash k diktování nebo záznamu jeho chování a funkčnosti. Některé hodnoty se aktualizují při používání terminálu. Například proměnná prostředí COLUMNS bude aktualizována, aby odrážela změny, které můžete provést v šířce okna terminálu:

BASHOPTS: Možnosti příkazového řádku, které byly použity při spuštění bash.
BASH_VERSION: Číslo verze bash jako řetězec slov a čísel.
BASH_VERSINFO: Verze bash jako číslice.
COLUMNS: Aktuální šířka okna terminálu.
DIRSTACK: Adresáře, které byly přidán do zásobníku adresářů příkazem pushd.
HISTFILESIZE: Maximální počet linky povolené v soubor historie.
HISTSIZE: Počet řádků historie povolených v paměti.
HOSTNAME: Název hostitele počítače.
IFS: The Vnitřní oddělovač pole slouží k oddělení vstupu na příkazovém řádku. Ve výchozím nastavení se jedná o mezeru.
PS1: Proměnná prostředí PS1 obsahuje definici primárního, výchozího a příkazového řádku. Do definice příkazového řádku lze zahrnout sadu tokenů nazývaných escape sekvence. Představují takové věci, jako je hostitelské 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ý řádek. Proměnná prostředí PS2 obsahuje definici této sekundární výzvy, která je ve výchozím nastavení znaménkem větší než (>).
SHELLOPTS: Možnosti shellu, které můžete nastavit pomocí možnosti set.
UID: Identifikátor uživatele aktuálního uživatele.

  Co jsou monitory do uší a kdo by je měl používat?

Podívejme se na několik z těchto proměnných shellu:

echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID

Pro úplnost uvádíme tokeny, které můžete použít v definicích příkazového řádku:

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 osoby, která je přihlášena.
h: Název hostitele počítače.
#: Každý příkaz v shellu je očíslován. To vám umožní zobrazit číslo příkazu v příkazovém řádku. Toto není stejné jako číslo, které bude mít příkaz v seznamu historie.
$: Nastaví konečný znak výzvy na znak dolaru ($) pro běžného uživatele a symbol hash (#) pro uživatele root. Funguje to tak, že zkontrolujete 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 mít proměnné prostředí dostupné pro vzdálené relace, jako jsou připojení SSH, budete je muset přidat také do souboru .bash_profile.

Formát definice proměnné prostředí je pro oba soubory stejný. Chcete-li přidat definici do svého souboru .bash_profile, zadejte toto do svého domovského adresáře:

gedit .bashrc

Přidali jsme proměnnou prostředí s názvem IHERITED_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 způsobit, že shell znovu načte soubor .bash_profile pomocí příkazu tečka (.) takto:

. .bashrc

Nyní vytvoříme proměnnou prostředí na příkazovém řádku:

LOCAL_VAR="This session only"

LOCAL_VAL=

Pokud použijeme echo, můžeme vidět, že jsou nám dostupné obě proměnné prostředí:

echo $LOCAL_VAR
echo $INHERITED_VAR

Všimněte si, že definice proměnné prostředí IHERITED_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ší pomocí příkazu bash, můžeme znovu zkontrolovat dvě proměnné z podřízeného shellu:

bash
echo $LOCAL_VAR
echo $INHERITED_VAR

Jak můžete vidět, IHERITED_VAR je přístupný v podřízeném prostředí, ale LOCAL_VAR není. Jednoduše dostaneme prázdný řádek.

Ačkoli „export“ přidává část proměnné prostředí do prostředí, které podřízené procesy zdědí, IHERITED_VAR není globální proměnná prostředí. Uživatel mary na něj například nemůže odkazovat:

echo $INHERITED_VAR

K uzavření naší podřízené bashové relace používáme exit:

exit

Zděděná prostředí ovlivňují i ​​skripty. Zde je jednoduchý skript, který zapíše hodnoty našich tří proměnných prostředí do okna terminálu:

#!/bin/bash

echo "WEBSITE" $WEBSITE
echo "LOCAL_VAR" $LOCAL_VAR
echo "INHERITED_VAR" $INHERITED_VAR

To bylo uloženo do souboru nazvaného envtest.sh a poté bylo provedeno jako spustitelné s následujícím:

chmod +x envtest.sh

Když skript spustíme, může přistupovat ke dvěma ze tří proměnných prostředí:

./envtest.sh

Skript může vidět globální proměnnou prostředí WEBSITE a exportovanou proměnnou prostředí IHERITED_VAR. Nemůže získat přístup k LOCAL_VAR, i když skript běží ve stejném prostředí, kde byla vytvořena proměnná.

  Jak zobrazit texty písní na iPhonu, iPadu, Macu nebo Apple TV

Pokud potřebujeme, můžeme exportovat proměnnou prostředí z příkazového řádku. Uděláme to s naším LOCAL_VAR a poté skript spustíme znovu:

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. Skript může také odkazovat na tuto proměnnou prostředí.

Vzdálená připojení

Globální proměnné prostředí jsou přístupné relacím vzdáleného přihlášení, ale pokud chcete, aby byly vaše lokálně definované proměnné prostředí dostupné vzdáleně, musíte 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. To by mohlo být zachyceno skriptem, řekněme, aby se upravilo jeho chování pro lidi používající systém lokálně nebo vzdáleně.

(S rizikem nejasností je zde také soubor .profile. Může také obsahovat definice proměnných prostředí. Soubor .profile se však nepřečte, pokud je přítomen soubor .bash_profile. Takže nejbezpečnější věc – a způsob kompatibilní s bash – je použít soubor .bash_profile.)

K úpravě souboru .bash_profile znovu 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 udělá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 v rámci inicializace vzdáleného přihlášení a proměnná prostředí INHERITED_VAR je přístupná nám i skriptu.

Zrušení nastavení proměnné prostředí

Chcete-li zrušit nastavení proměnné prostředí, použijte unset příkaz. Pokud zrušíme nastavení globální proměnné prostředí WEBSITE a exportované proměnné prostředí IHERITED_VAR, nebudou již dostupné na příkazovém řádku ani v podřízených procesech:

unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE

Je třeba poznamenat, že to 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ášena současně, bude mít stále přístup ke své instanci této globální proměnné prostředí. Jeho 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.

Jako příklad může uživatel mary stále přistupovat k proměnné prostředí WEBSITE a číst její hodnotu, i když ji uživatel dave ve své relaci zrušil:

echo $WEBSITE

Kontrola prostředí

Proměnné prostředí lze použít k tomu, aby skripty a aplikace věděly, jak se mají chovat. Lze je použít k uložení nastavení nebo malého množství dat. Skript může například naplnit prostředí hodnotou, na kterou mohou odkazovat jiné skripty, aniž by je bylo nutné zapisovat do souboru.