Shellové skriptovanie: pôvod shellu a POSIX

Dávno pradávno, v šesťdesiatych rokoch 20. storočia, keď počítače zaberali celú sálu, bol diaľnopis častý spôsob komunikácie s nimi. Pre nepamätníkov: diaľnopis sa dal predstaviť ako pokročilý písací stroj, ktorý nielenže klepal písmená na vložený papier, ale navyše údery klávesov prevádzal na elektrické signály, ktoré posielal rovno do počítača.

Na počítači bežal interpreter príkazov (command intepreter), ktorý používateľove príkazy vyhodnocoval, spracovával a prípadne zasielal späť do diaľnopisu elektrické signály, ktoré sa previedli na údery klávesov a teda čitateľný text na papieri.

Louis Pouzin nazval niekedy koncom roka 1964 tento interpreter (z neznámeho dôvodu) shell. Dnes sa shellom rozumie ľubovoľný nástroj, ktorý predstavuje rozhranie medzi používateľom a operačným systémom. Prastarý MS-DOS a jeho čierne prostredie bolo textovým shellom (presnejšie program command.com predstavoval shell), a zase windowsovské okná (s tlačidlom Štart) sú príkladom grafického shellu.

Na UNIXoch a Linuxoch vzniklo počas dlhého vývoja viacero textových shellov: od praotca sh (autorom bol Ken Thompson, z roku 1975), po súčasný štandard bash (Bourne Again Shell), cez KornShell typický pre operačný systém AIX od IBM alebo dash (Debian Almquist SHell), implicitný shell v distribúcii Debian a Ubuntu.

Hoci UNIXovské a linuxovské shelly zdieľali množstvo spoločných vlastností, časom každý z nich zaviedol špecifické vlastnosti a vylepšenia; tie však neboli kompatibilné v iných shelloch. To však išlo proti jednému z ušľachtilých cieľov Linuxu — a to voči portabilite. To sa žiaľ netýka len samotných shellov, ale aj ďalších aspektov, napr. sady dostupných nástrojov (utilít).

Samotný UNIX sa totiž historicky rozkonáril do troch významných vetiev: System V (prapôvodná, ale dnes už prakticky mŕtva), BSD UNIX, ktoré reprezentantom sú FreeBSD, OpenBSD a NetBSD, ale (prekvapivo) aj MacOS X a vetva otvorených systémov, z ktorých sa ujal predovšetkým GNU/Linux.

Každá z vetiev dáva k dispozícii nástroje, ktoré fungujú rovnako (napr. ls je k dispozícii zrejme všade). Mnohokrát ich možno volať s odlišnými parametrami ale odlišnosti spočívajú v sade parametrov (napr. zoznam procesov v UNIXe získame cez ps -AF, ale BSD má vlastnú syntax ps aux). Tú istú úlohu môže v rozličných vetvách realizovať rôzne nástroje (seq známy z GNU/Linuxu generujúci zoznamy čísiel má svoju analógiu v BSD zvanú jot).

Spoločným menovateľom vlastností, ktoré by mali byť k dispozícii všade a fungovať rovnakým spôsobom, je špecifikácia POSIX (Portable Operating System Interface). Jej cieľom je udržiavať kompatibilitu medzi operačnými systémami, čo sa netýka len shellov, ale aj sadou dostupných nástrojov, či jednotnou deklaráciou systémových volaní (API) operačného systému.

Veľké komerčné verzie UNIXu spĺňajú istú verziu POSIXu na 100% — klasiky AIX, Solaris, HP-UX, či už spomenutý OS X. Otvorené operačné systémy obvykle nemajú oficiálnu nálepku kompatibility, ale do veľkej miery ju spĺňajú — to sa týka najmä GNU/Linuxu, ale aj Free/Net/OpenBSD.

Špecifikácie pre POSIX sú k dispozícii online — napr. si môžete preštudovať verziu z roku 2004.

Ak budete písať svoje skripty v súlade so špecifikáciou POSIX, máte do veľkej miery garantovanú spustiteľnosť nielen krížom cez distribúcie Linuxu, ale aj cez jednotlivé vetvy UNIXu. Prirovnať by sa to dalo k niekdajšej situácii s webovými prehliadačmi: áno, môžete vytvárať weby, ktoré dokonale a elegantne pobežia v jednom prehliadači, ale omnoho lepšie je, ak sa posnažíte o čo najširšiu kompatibilitu. Neraz musíte oželieť množstvo skvelých vlastností špecifické pre konkrétny shell alebo dostupné len v jeho najnovšej verzii, ale na druhej strane máte garantovanú dlhodobú stabilitu a znovupoužiteľnosť vašich skriptov.

Príkladom sú distribúcie GNU/Linuxu Debian i Ubuntu. Do roku 2006 používali skripty písané primárne bashi, ale od roku 2006 prešli na skripty kompatibilné POSIXom. Využívajú na to vlastný shell dash, ktorého cieľom je jednak minimalistickosť, ale zároveň čo najväčší súlad s POSIXovou normou. Tento shell je zároveň omnoho rýchlejší než tradičný bash, čo sa prejavilo hlavne v zrýchlenom štarte systému.

Shelly, s ktorými sa možno stretnúť

  • Bash (Bourne-Again Shell, /bin/bash) — najčastejší shell dostupný v interaktívnom móde na Linuxe i Mac OS X. Najväčšie množstvo pestrej funkcionality na úkor portability.
  • Debian Almquist SHell (/bin/dash) — minimalistický shell so zámerom maximálnej kompatibility s normou POSIX. V Debiane a Ubuntu používaný pre štartovacie skripty.
  • Korn Shell (/bin/ksh) — typický pre operačný systém AIX od IBM. Oproti klasickému sh poskytuje hlavne asociatívne polia, arimetiku s plávajúcou čiarkou.
  • Bourne Shell (/bin/sh) — praotec shellov, dnes prakticky nahradený inými implementáciami. V moderných systémoch len symbolický odkaz na Bash alebo Dash.

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *