19Kapitola

Bash 19: Speciální parametry a vnitřní proměnné

Máme za sebou opakování a před sebou posledních několik dílů. Základy dávno dobře ovládáme a také skripty již umíme psát. Zbývá několik specialitek jako třeba speciální parametry a vnitřní proměnné Bashe.

Speciální parametry

Jistě si vzpomenete na poziční parametry, které jsme probírali v 17. díle. Speciálními parametry (anglicky special parameters) rozumí Bash vyhrazené proměnné, které lze pouze číst. Jejich jména jsou jednoznaká a často se vztahují k pozičním parametrům. O některých jsem se ostatně již tehdy zmínil. Byly to $0, $+, $@ a $#.

Ze speciálních parametrů týkajících se pozičních parametrů jsem tedy nezmínil $_. Ten zobrazí poslední argument (poziční parametr) naposled provedeného příkazu. Ne však v podobě, jak jsme jej zadali, ale po expanzi, tj. nahrazení zástupných znaků a jmen proměnných jejich hodnotami. O tom si ale povíme zase příště.

Užitečné je znát výstupní hodnotu naposled spuštěného příkazu. K tomu slouží konstrukce $?. Pro zkoušku můžeme nechat provést příkaz např. ls /home, který by měl v linuxovém systému souborů být čitelný pro všechny, takže by nemělo dojít k chybě. Hned po jeho skončení zkuste zadat echo $? a mělo by vám být odpovězeno 0, tedy návratový kód značící absenci chyby.

Jinak tomu bude, když budeme zkoumat výsledek chybového příkazu, dejme tomu ls /homer. Za předpokladu, že nemáte adresář homer v kořenu svého systému, skončí tento příkaz chybou. Výstupem echo $? bude návratový kód 1, tedy chyba. Více o návratovém kódu najdete v 10. dílu tohoto seriálu.

Také se vám občas stává, že nějaký proces v textové konzoli nebo celá konzole takříkajíc zatuhne? V některých případech zbývá jako jediné řešení zabít (viz příkaz kill ve 2. díle) shell, který byl na dané konzoli spuštěn. Jak ale ve výpise běžících procesů (ps aux) poznat ten pravý? Jak to udělat, abychom nezabili zdravý Bash, ve kterém právě pracujeme? Stačí zjistit jeho PID. Zkuste echo $$ a hned budete vědět, kterou větev nepodřezávat.

Zmíním ještě vykřičník, tedy parametr $! - jeho hodnotou je také ID procesu. Ne však shellu, ale naposledy spuštěného příkazu na pozadí. Spouštění procesů na pozadí a jejich řízení Bashem jsme podrobněji probírali ve 2. dílu. Další poziční parametry najdete v manuálové stránce (man bash).

 

Proměnné shellu

Vedle pozičních a speciálních parametrů nastavuje Bash ještě spoustu dalších proměnných. Některé jsme si představili v 5. dílu. Jsou to proměnné běžného typu. Mají slovní jména (ač psaná velkými písmeny) a lze je i měnit. Jejich kompletní výčet najdete v dokumentaci k Bashi.

Na ukázku jsem vybral proměnnou význačně pojmenovanou BASH. Udává absolutní cestu k binárnímu souboru, kterým byl právě běžící Bash spuštěn. Demonstrujme rozdíl od speciálního (pozičního) parametru $0, který udává cestu relativní:

[milarb@NBL1 ~]$ echo $BASH
/bin/bash
[milarb@NBL1 ~]$ ../../bin/bash
[milarb@NBL1 ~]$ echo $BASH
/home/milarb/../../bin/bash
[milarb@NBL1 ~]$ echo $0
../../bin/bash

Nejprve jsem stál ve svém domovském adresáři (/home/milarb) a dotázal jsem se na hodnotu proměnné BASH. Potom jsem spustil Bash voláním jeho binárky pomocí relativní cesty (../../bin/bash). V takto spuštěném Bashi (prompt se nijak nezměnil) jsem se pak tázal na hodnoty $BASH a $0.

Zajímavůstkou je BASH_COMMAND vypisující zadání právě běžícího příkazu. Výsledkem echo $BASH_COMMAND je tak paradoxně echo $BASH_COMMAND. Proměnná HISTCMD zase udává, kolikátý v pořadí v rámci uchovávané historie provedených příkazů je ten právě prováděný.

Pro zjištění PID rodičovského procesu, což může být vhodný doplněk $!, lze najít pod názvem $PPID. Podobně můžeme zjistit identifikační číslo právě přihlášeného uživatele - $UID. A takto bychom mohli ve výčtu pokračovat. Příště si ukážeme, jaké triky Bash s proměnnými dokáže.