Elindítjuk sorozatunkat, amely a szabvány shell-be enged betekintést, hiszen a telepítő indításától kezdve, a rendszergazda tevékenység legegyszerűbb szkriptjeiig ez az és jóformán egyetlen – eszköz, amellyel minden szabvány körülmény között biztosan dolgozhatunk.
A szabvány shell feladata, haszna és eredete
A számítógép 2 alapvető eleme a központi feldolgozó egység (CPU) és a memória.
Az ismert, általános célú operációs rendszerek a memóriát 2 részre osztva használják. Az egyik, extra védelemmel ellátott terület, maga a rendszer lényegi alapja, a kernelspace, a másik pedig az a memóriaterület, amelyben a gépi és emberi felhasználók által futtatott programok futnak, a userspace.
Az ember felhasználók tipikusan a háttértáron telepített alkalmazások ('app'-ok) közül szeretnék hol ezt, hol azt, esetleg többet is futtatni, amely interakciót igényel.
Ahhoz, hogy ezt megtehessék szükségük van tehát egy megfelelő környezetet, héjat biztosító programra, amelyből ezt megtehetik.
Ez a funkció a héj, a rendszergazdák, programozók által használt angol nevén a shell.
2-féle:
* grafikus üzemmódú és
* karakteres üzemmódú shellel szoktunk találkozni, előbbi egyszerű feladatok elvégzésére kényelmes, például egy mappa létrehozására, mi most a rendszergazdák illetve szkriptprogramokat írók számára legalapvetőbb, a szabvány shell-el, fogunk fogalkozni, ez az a parancssori eszköz, amely már több, mint fél évszázada rendelkezésünkre áll, és amely a rendszergazdák, és a rendszerközeli szkripteket írok legalapvetőbb eszköze.
A shell környezete, a szabvány terminál és szabvány virtuális terminál emulátor, prompt
A szabvány shell-t vagy tty vagy vt terminál emulátorban futtatjuk.
Amikor elindult, akkor a prancsbeviteli jellel (pronpt) találkozunk. Nézzük meg, hogy tipikusan mit látunk ilyenkor:
user@host:~$ _
A záró $ vagy # karakter a normál vagy roor jogú felhasználót jelenti, a : után pedig az aktuális munkamappát láthatjuk.
A shell-be írt parancsainkat az Enter billentyűvel visszük be. A szabvány shell tiszta, beépített eszkötein kívül (builtins) külső, leggyakrabban coreutils segédeszközöket, alkalmazásokat is meg tudunk hívni argumentumokkal, Grafikus üzemmód alatt futó virtuális terminál emulátorban akár az ilyeneket is, melyek hasznosan ide naplóznak, például:
firefox -private-window https://debian.org/
Az alapokon túli kiegészítésekként a coreutils parancsok használata (például, ls, sleep, stb,) gyakran része a shell szkripteknek, de az átlátható szkriptelést figyelembe véve igyekezzünk a shell-ben írt programjaink során a legnagyobb mértékben a beépített eszközökre támaszkodni.
A shell programok imlicit és explicit meghívása
A shell-be gyakran implicit módon 'one-liner' programokat gépelünk, mint például egy
echo "Helló Világ!";
Helyesebb azonban még 'one-liner' esetében is a szkriptek általánosabb, az interpretert explicit megnevező hívást használni, shell esetében:
sh -c 'echo "Helló Világ!";';
A shell, mint rendszertechnikai célú programnyelv
A shell-t nem általános célú szkriptnyelvnek – mint például a Perl-t vagy Python-t – hanem alapvetően rendszertechnikai célú programnyelvnek – kell tekinteni, korlátozott mértékben másra is alkalmas.
Programnyelv, mert tartalmazza ennek kellékeit, mint például újrafelhasználás (szimbólunok (csak 0-terminált sztringek) , ...), modularitás, aritmetika, folyamatvezérlés (flow control).
Első példaprogram: "Írd le fiam százszor"
sh -c 'x=0; while test $x -le 100; do printf "Én vagyok a lexebb\n"; x=$((x+1)); done; # köszi'
Elemzés:
A szabvány shell nem ismer típusokat, csak 0-terminált sztringet tud, így az értékadó utasításnál nem kell típusra hivatkozni.
Az egyszerű vagy összetett utasításokat mindig a ; karakterrel zárjuk le.
A szokásos while ciklusban itt tesztelő feltételt adunk meg a shell szintaxisában -le <= jelentéssel bír, mivel a < karaktert amúgy adatátiránytó karakternek használha a shell.
A $ jel mögötte lévő kifejezésben visszakapott skalár sztring újrafelhasználását jelenti, ez lehet csak egy másik változónak közvetlen átadás, aritmetikai vagy karakterkezelő kifejés vagy akár subshell kiemete, bármi.
A kódblokk szintű modularitást több módon biztosítja a shell, a program elején definiálható saját függvénynél hagyományosabb, míg a ciklusban a do és done kulcsszavak között. A printf legegyszerűnn formáját használtuk.
Az aritmetikai kifejezést mindig (()) által tesszük itt értelmezhető aritmetikai egységgé. A ()-t a shell subsehll egységnek használja. A # mögötti rész pedig a kódban mindig hasznos megjegyzés :)