A Unix operációs rendszerben különféle parancssori értelmezők működnek, melyeket rendszerhéjnak vagy angolul shellnek nevezünk. Ez a rendszerhéj az összekötő kapocs a rendszer magját képező kernel és a felhasználó között. Az asztali rendszereken ezeket többnyire grafikus felületek egészítik ki. A shellből (konzolról) vezérelt gépek előnye, hogy jóval kisebb erőforrásigényűek a grafikus felületeknél. A grafikus felhasználói felületek (GUI) ugyanis egyrészt újabb réteget képeznek a rendszermag és a felhasználó között, másrészt erőforrásigényük többnyire magas. Ennek következtében a shellből (konzolról) vezérelt rendszerek stabilabbak, és gyorsabbak, így teherbírásuk miatt napjainkban főleg Unix alapú kiszolgálókon népszerűek.

Egy Gentoo Linux alatt futó BASH (Bourne Again Shell) képernyőkép

Unix-típusú rendszerek alatt a felhasználó több rendszerhéj között is választhat, melyek mindegyike rendelkezik egyedi tulajdonságokkal, melyek segítségével bizonyos feladatok könnyebben elvégezhetőek, mint más rendszerhéjakkal. A számítógépbe történő bejelentkezés után a rendszerhéj indítja el az operációs rendszernek nélkülözhetetlen folyamatokat és automatikusan induló programokat.

A shell programozható az úgynevezett shellscriptek segítségével. Ez egy speciális parancsnyelv, mely az operációs rendszer által értelmezhető utasításokat tartalmaz, így a klasszikus értelemben vett programozási nyelvektől eltérően nincs szükség a kód lefordítására és linkelésére.

A Unix-rendszerhéjak kialakulása szerkesztés

Steven Bourne, az AT&T / Bell Laboratories egyik munkatársa az elsők között fejlesztett ki parancsértelmező rendszerhéjat a Unix operációs rendszerekhez még a '60-as, '70-es években. A Bourne Shell nevét alkotójáról kapta, és ez lett az első széles körben elterjedő rendszerhéj, mely új formájában (Bourne Again Shell) ma is népszerű.

Mikor a University of California at Berkeley is bekapcsolódott a Unix fejlesztésébe, új színfoltot hoztak a shellek világába: Bill Joy programozó vezetése alatt megalkották a saját, Bourne Shellhez képest számos kényelmi funkcióval és C-nyelvhez hasonlatos szintaktikájú parancsértelmezőjükkel ellátott megoldásukat, a C Shellt. Egy anekdota szerint nevét a „sea shell” (tengeri kagyló) szójátékból kapta. A C Shell fejlesztése az 1970-es évek végén új erőre kapott, ennek eredménye lett a TENEX C Shell, amelyet főképp Ken Greernek és Paul Place Waynnek köszönhetünk.

Az 1980-as évek derekán David Korn vezetésével a Bell Laboratories továbblépett a Bourne Shellen, megalkotva a korn Shellt. Ez volt a Unix System V ágának első modern shellje. Ennek a rendszerhéjnak készült egy a nagyközönség számára is ingyenesen használható változata, a Public Domain Korn Shell. Később a Free Software Foundation (Szabad Szoftver Alapítvány) megalakulása, a GNU licencelés új héjprogramot hívott életre, a Bourne Again Shellt. Ez a megoldás nem más, mint az egykori ős-Bourne Shell GPL-licencelésű, továbbfejlesztett változata, amelyet ma már az első számú linuxos shellként tartanak számon, a 2010-es években futtató shellként ennek komoly vetélytársa lett a dash - mely a szabvány - ISO 9945 - shell közelibb magvalósítása.

A shell általános képességei szerkesztés

Minden Unix-alapú rendszerben lehetséges:

  • saját parancsok kivitelezése
  • „wildcard”-ok (speciális illesztések) használata fájlnevekben: *, ?
  • héjprogramok ("szkript"-ek) végrehajtása
  • feltételes kifejezések (if, case) és ciklusok (while, for) alkalmazása
  • beépített parancsok használata (cd, read)
  • pszeudo-parancsok létrehozása (alias)
  • belső változók használata
  • a környezet manipulálása új folyamatok indítása előtt
  • bemenet és kimenet átirányítása
  • több folyamat indítása, ezek adatcseréje csöveken (pipe) keresztül
  • folyamatok indítása a háttérben
  • a jelentkezési karakter definiálása (prompt)
  • külső parancsok keresési sorrendjének megadása

A modernebb rendszerhéjak ezen felül még az alábbi tulajdonságokkal is rendelkeznek:

  • parancssorszerkesztés (command line editing) és kiegészítés (completion)
  • korábbi parancsok visszakeresése és szerkesztése (command history)
  • folyamatok megállítása és újraindítása (Job Control)
  • számítási feladatok elvégzése (expr)
  • állománytulajdonságok tesztelése (test)
  • jelzések (signal) küldése (kill) és fogadása (trap)
  • más folyamat bevárása (wait)

Egy parancs leállítása esetén a rendszerhéj a billentyűzet-meghajtót is használja. CTRL-C a parancs leállítását vonja maga után, és ezt a billentyűzet-meghajtó indítja el.

Működése szerkesztés

Az operációs rendszerek működtetése közben a felhasználó és a gép közötti kommunikáció valamilyen terminálon (esetleg virtuális, vagy emulált környezeten) keresztül történik. Ennek egyik eszköze a shell is, melyen keresztül a vezérlés szöveges karakterekre korlátozódik. A vezérlő jelsorok elsődleges beviteli eszköze (standard input, vagy röviden STDIN) a használt terminál billentyűzete. Minden egyes billentyű lenyomásakor annak kódját a shell megkapja és egy pufferben tárolja, amelynek tartalmát többnyire szerkeszteni is lehet. A parancssor ezen szolgáltatását sorszerkesztőnek, vagy promptnak nevezzük. A sorszerkesztővel többnyire egyszerű műveleteket – törlést, felülírást, beszúrást – végezhetünk a kurzormozgató billentyűk segítségével. Ezt követően a bevitt jelsor megjelenik a terminálon. Egy érvényesítő végjellel (alapértelmezésként ez az ENTER vagy RETURN billentyű) lehet a parancsot értelmeztetni.

Ilyenkor a puffer tartalmát megkapja a shell értelmező (interpreter) része, amely szétbontja utasításokra és paraméterekre. Az utasítások között elsőbbségek, precedenciák lehetnek, azaz nem feltétlenül beviteli sorrendben lesznek elindítva. Végrehajtás során, ha szintaktikailag helyes az utasítássor, akkor a shell először helyettesítő névként (alias), ha nincs ilyen, akkor a beépített parancskészletében (builtin) keresi meg a parancshoz tartozó cselekvéssort. Ha ilyen nem létezik, akkor egy alkalmazás neveként értelmezi, és megkísérli elindítani. A beépített parancsok a shellbe vannak integrálva, így működésében olyan, mintha egy programfájl kerülne végrehajtásra, azzal a különbséggel, hogy nem különálló részként található meg a fájlrendszeren. Egyes shellekben lehetőség nyílik a korábban kiadott parancsok tárolására, újbóli kiadására. Ezeket a parancsokat összefoglaló néven előzményeknek (history) nevezzük, az őket tartalmazófájl pedig az előzményfájl, mely általában rejtett, és a shellt futtató felhasználó saját könyvtárában, vagy bizonyos esetekben a shell saját programkönyvtárában, vagy ritkábban a gyökérkönyvtárban található.

Többnyire elmondható, hogy a végrehajtás szekvenciális, azaz egy újabb utasítás csak akkor adható ki, ha már egy korábbi lefutott. Ez igen nagy megkötés, ennek áthidalására szolgál a munkavezérlés, amellyel megtehetjük, hogy bizonyos parancsokat háttérben futtassunk külön folyamatként, vagy felfüggesszük. A felfüggesztett folyamatoktól a rendszer elveszi a CPU vezérlést, ha szükséges, a lefoglalt memóriájukat elsők között írja ki a lapozó (swap) partícióra.

Shell szkript szerkesztés

A shell szkript olyan számítógépes program, melyet arra terveztek, hogy egy szabvány shell implementáció futtassa. Legtöbbször önállóan futtatható fájlokban tároljuk őket. Az alábbi példa egy kutyát mozgat a képernyőn:

#!/bin/sh
#         ))__       __((
#         |__/       \__|
# )______))             ((______(
# /|    |)              (|     |\

while :; do
a="         ))__\f\e[13D         |__/\f\e[12D )_____))\f\e[10D /|    |)";
printf "\e[10;1;f\e[?25l"; c=0; while [ $c -le 43 ]; do printf "$a\e[3A\e[9D ";
sleep 0.018; c=$((c+1)); done; # balra
a="__((        \f\e[13D\\__|         \f\e[10D((______( \f\e[10D(|     |\\";
while [ $c -ge 1 ]; do printf "$a \e[3A\e[13D";
sleep 0.018; c=$((c-1)); done;
printf "\e[4B\r\e[?25h"; done;

Irodalom szerkesztés

  • Fehér János: Héjprogramok, Linux alatti parancsértelmezők 1.0
  • Helmut Herold: Linux-Unix-Shells, Bourne-Shell, Korn-Shell, C-Shell, bash, tcsh ISBN 3827315115
  • Alexander Mayer: Shell-Programmierung in Unix ISBN 3932311787

Kapcsolódó lapok szerkesztés