3.1. Bash / Funkce a skripty
1. Úvod
Funkce a skripty jsou základními prostředky pro automatizaci a umožňují opakovaně vykonávat komplikované operace pomocí jednoduchých příkazů. Tato kapitola pokrývá jejich vytváření a používání v Bashi a uvádí také nástroje Bashe používané především ve skriptech a funkcích (ačkoliv většinu z nich lze použít i v interaktivním režimu).
Funkce či skript je vždy tvořen uloženou posloupností příkazů, která může být „zavolána“ a přitom jí mohou být předány textové parametry. Hlavní rozdíl mezi funkcí a skriptem je, že funkce se ukládají do paměti konkrétní instance interpretu (podobně jako proměnné), zatímco skript je uložen v souboru (popř. se načítá z roury).
Interpret Bash je vyvíjen v rámci projektu GNU.
2. Definice
- Funkce je posloupnost příkazů k vykonání uložená v paměti interpretu (podobně jako proměnná). Spouští se zadáním jejího názvu jako příkazu a vykonává se v tomtéž interpretu (tzn. změny proměnných a nastavení provedené ve funkci zůstanou v platnosti i po návratu z ní).
- Skript je posloupnost příkazů k vykonání uložená v souboru (popř. načítaná z roury). Skript lze spustit několika způsoby (budou probrány níže). Skript se obvykle spustí v nové instanci interpretu (ve stejné instanci ho lze spustit příkazem „source“).
- Poziční parametry jsou zvláštní číslované proměnné dostupné jako „$1“, „$2“, ..., „$9“, „${10}“ atd. Při volání funkce či skriptu se tyto proměnné na dobu jejího/jeho běhu „překryjí“ textovými hodnotami parametrů, se kterými byla funkce či skript volán; ručně je lze nastavit příkazem „set“, ale pouze všechny najednou.
- Překryvná proměnná je dočasná proměnná ve funkci, která existuje jen do ukončení jejího volání. Pokud v momentě vytvoření překryvné proměnné již existovala (globální nebo překryvná) proměnná stejného názvu, nová proměnná tu původní na dobu své existence překryje (a tím pádem dočasně znepřístupní); čtení i přiřazení budou pracovat s překryvnou proměnnou a teprve po jejím zániku bude předchozí proměnná znovu zpřístupněna. Překryvné proměnné nejsou lokální — po dobu své existence jsou bez jakékoliv kvalifikace dostupné z celého skriptu, a dokonce mohou být exportovány (jako proměnné prostředí), aniž by to narušilo jejich dočasnost. Pozor, překryvné proměnné nejsou dovoleny mimo funkce (ani ve skriptu).
3. Zaklínadla: Základní
3/1 Logické řetězení příkazů
Poznámka: „příkazem“ se v těchto zaklínadlech rozumí příkaz včetně všech parametrů, přesměrování, rour apod., dokonce to může být i celý blok příkazů ve složených závorkách.
3/2 Řízení běhu
3/3 Zvláštní proměnné
3/4 Poziční parametry (skriptů i funkcí)
3/5 Funkce „zvenku“
3/6 Funkce „uvnitř“
3/7 Skript „zvenku“
3/8 Vykonání kódu
3/9 Obsluha signálů a zvláštních situací
3/10 Skript „uvnitř“
4. Zaklínadla: Testy pro podmínky
4/1 Typ a existence adresářových položek
Poznámka: V Bashi můžete všechny uvedené varianty příkazu „test“ nahradit konstrukcí [[ parametry ]], opačně to však neplatí. V interpretu „sh“ je můžete nahradit konstrukcí „[ parametry ]“.
Poznámka 2: Příkaz „test“ s výjimkou volby „-L“ následuje symbolické odkazy; pro vyloučení symbolických odkazů přidejte negovanou volbu „-L“.
4/2 Textové řetězce (testy)
4/3 Regulární výrazy (testy a extrakce)
4/4 Celá čísla (testy)
4/5 Čas „změněno“ u souborů a adresářů
4/6 Práva adresářových položek
Poznámka: testy -r, -w a -x netestují nastavená přístupová práva, ale faktickou proveditelnost dané operace; proto „w“ vrátí „nepravdu“ u souboru s právem „w“, který se nachází na oddílu připojeném jen pro čtení, a test „r“ provedený superuživatelem vrátí „pravdu“ u souboru, který nesmí číst nikdo „chmod a-r“.
4/7 Ostatní testy
5. Instalace na Ubuntu
Bash a všechny příkazy použité v této kapitole jsou základními součástmi Ubuntu přítomnými i v minimální instalaci.
6. Tipy a zkušenosti
- Klávesové zkratky Ctrl+C a Ctrl+C se chovají nečekaným způsobem při provádění cyklu nebo volání funkce z interaktivního interpretu. Pokud se tomu chcete vyhnout, uzavřete při volání funkci či cyklus do podprostředí.
- Funkce na rozdíl od aliasů nemají ochranu proti rekurzi, takže funkce může volat sama sebe. Pokud chcete funkcí nahradit nějaký externí příkaz a pak ho z ní volat, použijte vestavěný příkaz „command“.
- Bash nabízí několik možných syntaxí k definici funkce. Definice s příkazem „function“ je dle mého názoru nejsnáze čitelná, ale není příliš běžná.
7. Další zdroje informací
- GNU Bash Shell Functions (anglicky)
8. Zákulisí kapitoly
V této verzi kapitoly chybí:
- getopt
- proměnná SHLVL
Tato kapitola záměrně nepokrývá:
- Práci s proměnnými (viz kapitolu Proměnné příkazy a interpretu)
Další poznámky:
- Nastavení proměnné BASH_ENV umožňuje spustit „před-skript“ při spouštění skriptu.