Shell script-ek

Az eddigi ismeretek alapján most érkeztünk el arra a pontra, hogy használható shell programokat írjunk. Ennek folyamatát kísérjük végig most egy olyan program létrehozásával, amelyik a kurrens katalógusban található fájlok számát írja ki (egyszerűség kedvéért tekintsünk most el a rejtett fájloktól és más egyéb nyalánkságoktól). Nevezzük el programunkat nf-nek (number of files).

Ha parancssorban kiadva szeretnénk a kívánt eredményt megkapni, az alábbi parancsot kell végrehajtani:

 

$ ls | wc -w

11

$

A feladat ezek után csak az, hogy hogyan lehet ezt a parancsszekvenciát önálló parancsként indítani?

Első lépésként egy állományba kell bevinni a fenti szöveget, ezt megtehetjük például az ed editorral is, de legegyszerűbb, ha egy echo paranccsal átirányítjuk a kívánt szöveget az nf nevű állományba:

 

$ echo 'ls | wc -w' >nf; cat nf

ls | wc -w

$ ls # futtatas elotti ellenorzes

FULL-INDEX file newdir newfilee2 semmi temp

akarmi file1 newfile nf sendmail.cf text

$ ls | wc - w # eggyel tobb kell hogy legyen nf miatt

12

$

(Kérdés: Ha nem zárjuk aposztrófok közé a parancsszöveget, mi kerül nf-be? És miért?)

A nf állomány elkészülte után a futtatást többféle módon is intézhetjük. Az első két megoldásnál magának a parancsértelmezőnek a sokszor idézett meghatározásából indulunk ki: a shell egy olyan program, amely a standard inputot olvassa, az onnan érkező karaktereket megpróbálja végrehajtható parancsokként értelmezni és végrehajtani. Ha viszont a shell ugyanolyan “kutyaközönséges” program, mint a többi, akkor itt is átirányíthatjuk a bemenetet, hogy ne a billentyűzetről várja, hanem egy végrehajtható parancsokat tartalmazó fájlból — azaz nf-ből:

 

$ sh <nf

12

$

A második megoldás azon alapul, hogy a shell is futtatható úgy, hogy a paraméterként átadott fájl tartalmát olvassa be, és próbálja meg végrehajtani:

 

$ sh nf

12

$

Mindkét fenti módszer használható, de valaki joggal mondhatja azt, hogy “unfair” a shell parancsokat tartalmazó programok, és a mondjuk C nyelvről fordított, binárisan végrehajtható programok futtatásában ilyen különbséget tenni, hiszen az utóbbiak minden külön sh begépelése nélkül indíthatóak. Ezen meggondolás alapján a UNIX shell minden olyan állományt, amelyik nem bináris állomány, de végrehajtható (a megfelelő hozzáférési jog engedélyezett), úgynevezett shell fájlnak (más néven shellscript) tekint, a benne lévő szöveget pedig végrehajtandó shell parancsoknak tekinti, s aszerint próbálja meg végrehajtani.

Hogy egy állományt végrehajthatóvá tegyünk, a már ismert chmod paranccsal kell csupán a végrehajtást engedélyező hozzáférési bitet “bebillenteni”, s a shellscript már futtatható is:

 

$ chmod +x nf

$ ls -l nf

-rwxrwxrwx 1 demo guest 11 Aug 30 21:03 nf

$ nf

12

$

 

Tartalomjegyzék