Deprecated: Function set_magic_quotes_runtime() is deprecated in /DISK2/WWW/lokiware.info/mff/wakka.php on line 35
Unixový shell a jeho skriptování
Základní informace o unixovém shellu, příručky i tutorialy najdete jinde, tady se pokusme dát dohromady věci zajímavé souvislosti s tím, co se po nás chce v rámci předmětu
Úvod Do Unixu.
Standardy, co je «původní» shell a jak se vyhnout bashismům
Na přednášce RNDr. Libora Forsta bylo myslím řečeno, že něco na ten způsob, že bychom všechno měli umět naprogramovat v nějakém
původním,
nerozšířeném, nebo kdovíjakém shellu, ve slajdech se mluví o
/bin/sh a v literatuře je odkaz na knížku o Korn Shellu, na školních počítačích je třetí verze Bashe. Trochu zmatek, co?
Zdrojáky některé verze původního Bourne shellu (to je ten
původní, nebo spíše
jsou ty původní, protože o nějakých standardech nemůže být řeč) se dají na internetu najít, s tím se ale nemá cenu otravovat, pokud nejste vyloženě fandové na historii. C Shell (resp. i novější tcsh), je tak trochu perverzní shell, kterému je lépe se obloukem vyhnout, už proto, že má úplně jinou syntaxi než, ostatní shelly (lákavou, ale jen na první pohled). Na Korn shellu jsou sice založeny současné standardy, to ovšem neznamená, že Korn shell je sám o sobě standardní, standardní je jen jeho podmnožina. Pokud máte na svém Linuxu nějaký
/bin/sh je to buď jen odkaz na Bash, nebo nějaká jeho ořezanou verzi, i když se Bash volaný jako
/bin/sh snaží emulovat starý Bourne shell, je to pořád jen Bash.
Takže pozor
/bin/sh tedy u většiny z vás
není Bourne shell, navzdory tomu, co tvrdí Forstovy slajdy. U něj na FreeBSD je to nejspíš Almquist Shell, což je hodně blízko, ale na Linuxu je to téměř bez výjimky Bash, viz dále.
Nejlepší shell na otestování standardnosti skriptů je zřejmě Almquist Shell, který možná znáte z embedded zařízení (různých NAS, bezdrátových routerů apod.), který je jednak součástí NetBSD, jednak je vyvíjen jako
samostatný projekt DASH, má i
debianovský balíček. Dash má jen málo funkcí, které neodpovídají současným standardům, a také se ze současných shellů nejvíce blíží původnímu Bourne shellu. V Ubuntu se ho myslím chystají použít jako
/bin/sh.
A jak je to tedy s těmi standardy? V současnosti je nejlepší referencí
Single Unix Specification verze 3, následník starších norem SUS a POSIX. Ve svazku o shellu a nástrojích se dá najít jak přehledný popis vlastností standardního shellu, tak jakoby-manuálové-stránky základních příkazů.
Samozřejmě nevím, do jaké míry na to bude Forst u zkoušky přísný, ale tohle je podle mě jistá a jednoduchá cesta, jak se vyhnout problémům, a přinejmenším by to někoho mohlo zajímat:).
Co není přenositelné
Pár věcí, co vás možná překvapí:
- Lokální proměnné pomocí local (bash, dash) nebo typeset (ksh). Místo toho může být šikovné použít konstrukci varname=word [varname=word [...]] command, kde command může být nejen příkaz, ale i volání funkce(!). To naopak přenositelné je, a přiřazené proměnné se uvnitř funkce chovají jako lokální. Stejně to ale není dokonalé pozor na to, že pokud při vykonávání příkazu command dojde k dalšímu přiřazení do některé z proměnných, může se to stejně projevit (v závislosti na shellu — v ksh se to projeví, v bashi ne, a v dashi se projeví jen přiřazení prázdné hodnoty) vně funkce. Navíc může funkce zrušit proměnnou pomocí unset. Někdy je tedy pro přenositelnost nutné naprogramovat vlastní zásobník.
- echo -n a echo řetězec_s_escape_sekvencemi, místo toho použijte printf '%s' řetezec (kde řetězec je jen jeden argument, ne více).
Vnější odkazy