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
$