A parancsértelmező (shell)

A UNIX alatt futtatható programok között van egy, ami a rendszer szempontjából a többivel teljesen egyenrangú, a felhasználó számára azonban kitüntetett jelentőséggel bír: ez a program a parancsértelmező (burok, héj, shell). A parancsértelmező az a program, ami egy felhasználó belépésekor aktivizálódik, s a felhasználó kilépéséig ő veszi magára a felhasználó által begépelt parancsokat. A shell feladata éppen ez: a felhasználó által begépelt karaktersorozatokat szétbontja, megpróbálja végrehajtható parancsként értelmezni, feldolgozza és kifejti a parancsnak átadandó paramétereket, megkeresi az elindítandó programfájlt, és megpróbálja azt elindítani; a parancs végrehajtása után pedig visszaadja a vezérlést a felhasználónak, s kész az újabb begépelt parancsok végrehajtására.

A fentiekből is látható, hogy a shell alapvető fontosságú a felhasználó életében, hiszen gyakorlatilag csak azt látja a UNIX-ból, amit a shell látni enged.

A shell mint programozási nyelv

A shell azonban, az előbb elmondottakon túl, egy programozási nyelv is: lehetőség van a shell használatakor változókat definiálni, komplex vezérlési szerkezeteket, ciklusokat és elágazási feltételeket definiálni, gyakorlatilag a "komoly" programozási nyelvekben megszokott összes mechanizmus rendelkezésre áll. S mivel ezek a nyelvi szolgáltatások minden fordítás nélkül, a parancssorba történő begépeléskor rögtön rendelkezésre állnak a felhasználónak (interpreter elv), villámgyors és könnyen korrigálható lehetőség van komplex feladatok kipróbálására és megvalósítására anélkül, hogy az ember egy sort is leírna bármilyen magasszintű programozási nyelven.

A shell parancsok fájlba írásával (shellscript) pedig arra nyílik lehetőségünk, hogy bármikor újra futtathassunk egy adott shell parancsszekvenciát.

A "szerszámosláda" és a "deszkapad modell"

A UNIX shell számos mechanizmust biztosít arra, hogy már meglévő programok egymással való együttműködését koordinálja, lehetőséget ad arra, hogy az egyik program kimenetét a másik program felhasználhassa, stb. A shell-nek éppen ez a legnagyobb erőssége, hiszen így már meglévő, adott esetben csak egy-egy apró részfeladatot ellátó programocskákból olyan összetett parancsszekvenciákat építhetünk fel, amelyek már nagybonyolultságú, meglepően komplex feladatokat oldanak meg - ismét csak hangsúlyozva, anélkül, hogy az ember a megszokott módon, valami magasszintű nyelvben "programozna". Ez a mentalitás a UNIX-ban oly gyakran emlegetett szerszámosláda-filozófia (toolbox philosophy): meglévő apró elemeket építsünk össze nagyobbakká, ahelyett, hogy folyton újra fel kellene találnunk a kereket.

E módszer egyenes alkalmazása a mostanában oly divatos prototyping elve. Mit jelent ez? Tegyük fel, hogy egy IGEN BONYOLULT, IGEN SOKRÉTŰ feladatot kell megoldanunk. Az egyik lehetséges megoldás az, hogy nekiállunk, és egy kiválasztott magasszintű nyelven "beprogramozzuk" az egészet, lefordítjuk, futtatjuk, hibát keresünk, s így tovább, amíg a tökéletesség és hatékonyság megkívánt szintjét el nem értük. Más megoldás? Elő a szerszámosládával: megpróbáljuk már meglévő UNIX eszközeinkkel és programjainkkal megoldani a feladatot, egy shellscript-et írva, ami integrálja már meglévő saját- vagy rendszerprogramjainkat. Így viszonylag hamar belőhető ez a "deszkapados modell" (általában nagyságrenddel hamarabb, mint egy konvencionális programozási nyelvben), s a már működő modellt ezek után optimálhatjuk: a leglassabban működő részeket átírhatjuk valami hatékonyabb programozási nyelven - a lényeg az, hogy mindig csak a szükséges részeket és a szükséges mértékben optimalizáljuk.

Különböző shell-ek

Mivel a parancsértelmező nem része a UNIX magjának, hanem "csak" egy ugyanolyan program, mint a többi sok száz rendszer- és segédprogram, tetszőlegesen lecserélhető, és ízlés szerint másra váltható. Három általánosan elterjedt shell létezik a UNIX alatt (a kevésbé elterjedteket még felsorolni is fárasztó lenne), ezek a következők: a Bourne shell, a C shell és a Korn shell. A felhasználó, illetve a rendszeradminisztrátor döntésén múlik, hogy egy felhasználó milyen shell-lel dolgozik a UNIX alatt, s lehetőség van arra is, hogy a felhasználó menetközben, ideiglenes jelleggel újabb és újabb parancsértelmezőt indítson el a meglévő fölé, ha az éppen futó valamilyen okból nem felel meg neki. Mindez hihetetlen rugalmasságot kölcsönöz a rendszernek.

A Bourne shell, mely nevét szerzőjéről kapta, "a" szabványos UNIX parancsértelmező, ez minden UNIX rendszerben kell hogy szerepeljen. Könyvünk túlnyomó részében ezzel foglalkozunk mi is, éppen szabványos volta miatt.

A C shell, mely szintén régóta része a standard UNIX-nak, jóval többet tud, mint a Bourne shell, például lehetőség van az előző parancsok előhívására és átszerkesztésére, fejlett jobkezeléssel és még számos más kellemes vonással rendelkezik, nevét onnan kapta, hogy a kiadható parancsok és a vezérlési szerkezetek a C nyelvre emlékeztetnek (nem véletlenül).

A Korn shell, mely szintén szerzőjéről lett elnevezve, újabb, mint az előzőek, egészen mostanáig public domain szoftverként, illetve később már kereskedelmi forgalomban is megvehető programként terjedt, az SVR4-nek viszont már részét képezi, mi több, ez lett a szabványos parancsértelmező. Ezt annak köszönheti, hogy rendelkezik a C shell funkcióival, ugyanakkor felülről teljesen kompatibilis a Bourne shell-lel, tehát a felhasználónak nem kell egy teljesen új szintaxist megtanulnia.

A könyvünkben szereplő shell programozási példák többsége Bourne shellscript-et használ, de a C shell-ről és a Korn shell-ről szóló fejezetek természetesen a megfelelő nyelven írt script-eket is tartalmaznak.

 

Tartalomjegyzék