Nelekejte se, neopouštíme Bash, jen si ukážeme, jak pro něj tvořit skripty. Co jsou to skripty? Je to prostě jen seřazený seznam příkazů, které se mají vykonat. Takový nákupní seznam nebo výrobní plán.
Předpokládejme, že nějakou posloupnost příkazů používáte často v úplně stejné nebo jen malinko odlišné podobě. Otravuje vás ji stále hledat v historii nebo ji chcete využívat na více počítačích či spouštět pravidelně např. pomocí programu cron? Není nic jednoduššího než si tuto posloupnost uložit do textového souboru ? do skriptu.
Není to pravda něco na úrovni jazyka C, ale je to jednoduché a pro většinu věcí, které si běžný uživatel má čas sám napsat, to stačí. Navíc má skriptování i své velké výhody. Takový skript nemusíte kompilovat a spustíte jej na jakémkoli počítači (PC, Mac, Atari, Amiga, Sun, Sgi, ...) a operačním systému, kde běží Bash (Linux, BSD, Windows, MiNT, AIX, Solaris, ?).
Formát souboru
Skripty ukládáme do standardních textových souborů, tedy nikoli dokumentů typu OpenOffice.org. Pro editaci doporučuji textové editory, nikoli textové procesory, takže žádné OOo, KWord či Abiword. Nezáleží v celku na tom, zda zvolíte konzolový (vi, emacs, joe, pico, ...) či GUI (nedit, kedit, kwrite, kate, ...) textový editor nebo dokonce vývojový nástroj (Quanta+).
Doporučuji používat režim unixových konců řádků (tj. pouze znak LF) a kódování češtiny, které máte nastaveno v textové konzoli (většinou ISO 8859-2 nebo UTF-8). První řádek souboru by měl obsahovat právě tuto posloupnost znaků: #!/bin/bash.
V našem případě je interpretrem Bash, jehož spustitelným souborem je /bin/bash. Pokud byste ovšem psali skript třeba v Perlu, byla by tam cesta k němu, tj. např. #!/usr/bin/perl.
Znak křížek (též "mřížka" nebo dokonce jsem slyšel i verzi "vězení") říká interpretru, že od tohoto místa až do konce řádku je to poznámka a tudíž si textu tam uvedeného nemá všímat. Naopak vykřičník zde slouží jako uvození informace o tom, kde najde systém interpretr pro spuštění daného skriptu.
Ukázka skriptu
Řekněme, že máte často potřebu zjistit stav svého systému. Používáte uname (identifikace systému), uptime (jak dlouho systém běží) a ping (test, zda běží server 192.168.0.1 a internet - např. www.linux.cz). Skript by mohl vypadat takto:
#!/bin/bash # Skript pro testování stavu systému uname -a uptime ping -c 3 192.168.0.1 ping -c 3 www.linux.cz
Způsob spouštění
Tím, že text někam vepíšeme a uložíme jej do souboru (pojmenujme jej "stav.sh") jsme ještě nedostali plnohodnotný skript. Je to textový soubor obsahující příkazy Bashe, to ano. Nejde ovšem přímo spustit. Pokud jste nedočkaví, můžete jej spustit nepřímo - zadejte příkaz bash stav.sh, čímž spustíme nový Bash s parametrem v podobě našeho skriptu.
Mnohem pohodlnější by byla možnost udělat z našeho textíku spustitelný soubor. To ale v unixovém systému není problém. Stačí nastavit přístupová práva, např. chmod a+x stav.sh. I tak ale budeme muset zadat vždy cestu k souboru. Máme ho totiž uložen někde v domovském adresáři, který (většinou) není předurčen (není v proměnné PATH) k hostování spustitelných souborů. Přesto si již můžeme činnost skriptu vyzkoušet, např. standardní konstrukcí ./stav.sh.
Pokud bychom chtěli skript spouštět odkudkoli prostým zadáním jeho jména, musíme jej nakopírovat do některé ze systémových cest (uvedených v proměnné PATH). Takovým místem bývá podadresář bin v domovském adresáři každého uživatele. Pokud neexistuje, vytvořte si jej a skript tam přesuňte (mv stav.sh ~/bin/). Pokud byste chtěli, aby byl skript dostupný všem uživatelům systému, musíte jej umístit do veřejně přístupného systémového adresáře (např. /usr/local/bin). K tomu ale potřebujete oprávnění uživatele root.
Zda máme v seznamu cest podadresář bin svého domovského adresáře, zjistíme jednoduše vypsáním obsahu proměnné $PATH, tedy echo $PATH. Pokud tam není, můžeme to napravit zadáním PATH=$PATH:$HOME/bin a potom export PATH.
Závěr
Tak, a úvod do skriptování máme za sebou. Pro dnešek toho necháme, ať si to můžete do příště zkoušet. Věci zde probrané budu považovat za samozřejmé a již se k nim nebudu vracet. Od dalšího dílu se vrhneme na věci, které se ve skriptech dají použít mnohem efektivněji než na příkazové řádce (podmínky, čtení z klávesnice, cykly, ...).