Tak vás hezky vítám u čtvrtého setkání s Bashem. Umíme toho pořád víc, ale k napsání nějakého užitečného skriptu to zatím nestačí. Posuneme se proto dnes zase kousek kupředu úvodem do problematiky proměnných prostředí. Abychom si je dostatečně vychutnali, naučíme se nejprve ohánět příkazem echo.
echo
Echo znamená v angličtině ozvěnu. Tento příkaz vypíše na standardní výstup zadané argumenty, oddělí je mezerou a zakončí znakem nový řádek. Můžeme si tak zakřičet např. echo Halooo. Počítač by měl prostě vypsat Halooo. Tak jsme prokázali, že echo, tedy ozvěna, funguje.
Zkusíme-li zadat více argumentů (slov) současně, vypíše echo všechny argumenty - také současně. Rozšiřme naše volání na echo Volám do lesa. Ozve se Volám do lesa. Vidíme tedy, že Bash je kompatibilní s příslovím, jak se do lesa volá, tak se z lesa ozývá.
Pokud bychom chtěli, aby echo chápalo více slov jako jeden argument, můžeme je uzavřít do uvozovek (") nebo apostrofů ('). Ty pak nejsou ve výsledku zobrazeny. Z echo "Volám do lesa" 'a na pole' tak vznikne Volám do lesa a na pole.
Rozdíl mezi uvozovkami a apostrofy je v tom, že uvozovky dovolují Bashi provádět speciální znaky. Naopak to, co je v apostrofech, bude vypsáno přesně tak, jak to zadáme. Prakticky si to ukážeme dále v souvislosti s proměnnými.
Příkaz echo je sice velmi jednoduchý, ale i tak má k dispozici několik přepínačů. Jedním z nich je -n, který zamezí přidání znaku nový řádek na konec výstupu echo. Toho využijeme, chceme-li z více příkazů echoposkládat jeden řádek výstupu.
Dalším přepínačem je -e. Ten způsobí, že echo bude rozumět speciálním skupinám znaků, které jsou uvozeny zpětným lomítkem. Výčet některých uvádím.
\a - výstraha (zvonek)
\b - zpětné mazání
\c - potlačit přebývající konec řádku
\e - znak escape
\f - nová stránka (FF)
\n - nový řádek
\r - návrat vozíku (CR)
\t - horizontální tab
\v - vertikální tab
\\ - obrácené lomítko
\0nnn - znak zadaný osmibitovou hodnotou nnn v osmičkové soustavě (nula až tři osmičkové číslice)
\nnn - znak zadaný osmibitovou hodnotou nnn v osmičkové soustavě (jedna až tři osmičkové číslice)
\xHH - znak zadaný osmibitovou hodnotou HH v šestnáctkové soustavě (jedna nebo dvě šestnáctkové číslice)
Můžeme vyzkoušet malou tabulku zadanou v jednom řádku: echo -e "Kernel\tVerze\nLinux\t2.6.8". Tabulátory (\t) zajistí stejné odsazení druhého sloupce v obou řádcích. Znak nový řádek (\n) snad nepotřebuje vysvětlení. Za povšimnutí však stojí, že se speciální znaky zadávají těsně k vypisovanému textu.
Poslední přepínač příkazu echo je -E, který je opakem -e. Konkrétně přinutí echo, aby nerozlišovalo speciální znaky začínající zpětným lomítkem. Zkusme zadat echo -E "Kernel\tVerze\nLinux\t2.6.8". Výsledkem nebude tabulka.
Ještě pár otázek k obráceným lomítkům. Pokud bychom v posledním příkladu (ten s -E) neuvedli uvozovky, vypadal by výpis ještě malinko jinak. Obrácená lomítka by se v něm neobjevila. Znaky za nimi (t a n) však ano.
To vyplývá z funkce obráceného lomítka mimo uvozovky. V takových situacích zajistí zobrazení bezprostředně následujícího znaku bez jeho speciálního významu. Tak můžeme pomocí příkazu echo vypsat uvozovky, apostrof nebo dolar. Zkusme si: echo uvozovky ", apostrof , dolar \$.
Proměnné
Operační systémy se již dlouhou dobu neobejdou bez možnosti nastavit určité parametry za chodu. Využívá se k tomu nástroj zvaný proměnná prostředí. Je to něco jako proměnná v matematických rovnicích, ale nemusí mít jen číselnou hodnotu.
Hodnoty proměnných prostředí lze snadno zjistit, což z nich dělá dobrý prostředek pro předávání informací mezi běžícími programy. Snadno se dají měnit, čímž lze ovlivňovat chování programů nebo i celého systému za běhu.
Proměnné jsou definovány svými jmény, která zpravidla tvoříme velkými písmeny bez diakritiky. Nejprve se podíváme, jak lze proměnné přiřadit hodnotu. Řekněme, že chceme do proměnné CISLO uložit hodnotu 5. Provedeme to znaménkem "rovná se", takže CISLO=5.
Abychom předešli nežádoucí interpretaci přiřazované hodnoty ze strany Bashe, můžeme ji obalit uvozovkami, tedy CISLO="5". Nyní by měla naše proměnná obsahovat hodnotu 5.
Jak si ale hodnotu proměnné ověřit? Použijeme k tomu nám již známý příkaz echo. Zápisem echo CISLO bychom ale dospěli pouze k výpisu textu CISLO. Příkaz echo by prostě vypsal to, co jsme mu zadali.
Chceme-li, aby Bash pracoval s hodnotou proměnné, musíme před její jméno zadat znak $. Výpisu hodnoty naší proměnné tak dosáhneme příkazem echo $CISLO.
Podobným způsobem můžeme ukládat do proměnných textové řetězce. Např. MUJTEXT="Nějaký text", a potom echo $MUJTEXT. Pokud ve vaší konzoli není správně nastavena čeština, používejte klidně texty bez diakritiky.
Nyní můžeme pomocí příkazu echo kombinovat textové řetězce s hodnotami proměnných. Třeba echo "Moje číslo je $CISLO". Nebo echo "Můj tajný text zní: $MUJTEXT".
Spojování řetězců lze využít i při deklaraci proměnných. Mějme JMENO="Bart" a PRIJMENI="Simpson". Potom CELE="Celé jméno zní $JMENO $PRIJMENI." a z echo $CELE vypadne celá věta s doplněným jménem a zakončená tečkou.
Hodnotu jednou naplněné proměnné můžeme změnit jejím doplněním nebo přepsáním. Přepsání se provede prostě tak, že dané proměnné přiřadíme novou hodnotu. Tak třeba MUJTEXT="Volám do lesa".
Doplnění textu do proměnné uděláme složením s použitím původní hodnoty proměnné a nového obsahu. Např. MUJTEXT="$MUJTEXT a na pole". Nyní můžeme zkusit echo $MUJTEXT. K původnímu obsahu byl doplněn zadaný text.
PATH
Pravděpodobně nejznámější systémovou proměnnou v unixových operačních systémech (a nejen v nich) je PATH. Název proměnné tvoří anglické slovo znamenající cesta. Cesta ve významu posloupnosti adresářů v adresářové struktuře našeho systému souborů.
Zkusme se podívat, co PATH ve vašem systému obsahuje. Když jsem já zadal echo $PATH, vypadlo na mne /usr/local/bin: /usr/bin: /bin: /usr/X11R6/bin: /home/milarb/bin. Je to seznam pěti cest nezakončených lomítkem a oddělených od sebe dvojtečkou.
Tento seznam prochází operační systém (resp. Bash), když mu zadáme ke spuštění nějaký program pouze jeho jménem bez uvedení cesty k němu. Můj systém by se nejprve díval do /usr/local/bin, pokud by tam program nenašel, zkusil by /usr/bin, pokud ani tam ne, pak /bin, dále /usr/X11R6/bin a nakonec /home/milarb/bin, tedy podadresář bin v mém domovském adresáři.
Pokud Bash nenajde spustitelný soubor daného jména v žádném z adresářů uvedených v PATH, ohlásí nám dobře známé command not found. Všimněte si, že Bash hledá pouze v zadaných adresářích, a nikoli v aktuálním adresáři, a proto je musíme spouštět konstrukcí ./prikaz. To je jedna z odlišností unixových a dosových systémů.
Bystřejší z vás možná napadlo, jak by se tento "problém" dal obejít. Stačilo by přece na konec proměnné PATH přidat řetězec ":.". Ano, fungovalo by to, ale je to výrazné narušení bezpečnosti systému. V historii unixových útoků se vyskytl nejeden trojský kůň schovaný do spustitelného souboru ls umístěného v nějakém adresáři, který poslušně vypsal obsah adresáře (samozřejmě kromě sebe sama), a následně vykonal nějaký záškodnický kód.
Mnohem méně ohrozíme bezpečnost a upgradujeme atraktivnost našeho systému, pokud do proměnné PATH přidáme /usr/games. S použitím dříve nabytých poznatků můžeme suverénně zadat PATH=$PATH:/usr/games.
Závěr
Tak tolik pro dnešek k proměnným. Příště v nich ale budeme pokračovat, takže se můžete těšit na pole, kulaté závorky, příkaz export a příklady některých dalších systémových proměnných.