Ukazna lupina je tolmač, ki ga Unix uporablja za ukaze, ki jih vtipkamo. Lupina ji pravimo zato, ker ovija in skriva jedro operacijskega sistema. Pomembna lastnost Unixa je, da sta jedro in ukazna lupina dva ločena programa, ki se sporazumevata prek razmeroma majhnega števila sistemskih klicev. To omogoča obstoj več različnih ukaznih lupin, od katerih vsaka ustreza svojemu okusu glede uporabniških vmesnikov.
Navadno se nam ukazna lupina po prijavi oglasi s pozivnikom
$
(razen če tega nismo prikrojili po svoje). Tu ne bomo
izgubljali besed o skladnji ukazne lupine in enostavnih zvijačah, ki jih
lahko pričaramo na zaslon -- namesto tega si bomo s stališča
računalnika ogledali, kaj se dogaja v ozadju.
Po zagonu, in preden poženemo kak program, si lahko računalnik predstavljamo kot pravi zverinjak procesov, ki vsi čakajo, da se bo zgodilo nekaj, na kar se bodo odzvali. Čakajo na dogodke (angl. event). Dogodek je lahko pritisk tipke ali premik miške. Če je računalnik povezan v omrežje, je dogodek lahko tudi podatkovni paket, ki je prispel iz omrežja.
Eden teh procesov je tudi jedro. To je poseben proces, saj določa, kdaj lahko tečejo uporabniški procesi, navadno pa je tudi edini proces, ki ima dostop do strojne opreme. Uporabniški procesi morajo zato nasloviti zahtevek jedru, če želijo prebrati vnos s tipkovnice, izpisati znak na zaslon, zapisati ali prebrati podatke z diska ali bolj ali manj karkoli, razen mleti podatke v pomnilniku. Takim zahtevkom jedru pravimo sistemski klici.
Praviloma gredo vse vhodno-izhodne operacije prek jedra, tako da lahko to razporedi zahtevke in prepreči, da bi ti drug drugemu hodili v zelje. Izjemoma je procesu dovoljeno, da zaobide jedro in neposredno komunicira z vhodno-izhodnimi vrati. Strežnik X (program, ki v večini sistemov Unix obravnava zahtevke drugih programov za pisanje po zaslonu) je ena takih izjem. A nismo še pri strežnikih X -- za zdaj se ukvarjamo s pozivnikom ukazne lupine v tekstovnem načinu.
Ukazna lupina je zgolj uporabniški proces, in nič kaj posebno odličen. Čaka na pritisk tipk, tako da (prek jedra) bere vhodno-izhodna vrata tipkovnice. Ko jedro zazna pritisk tipke, ga izpiše na zaslon. Če je to tipka Enter, jedro poda celotno natipkano vrstico ukazni lupini. Ta jo zatem poskusi raztolmačiti kot niz ukazov.
Denimo, da smo zato, da bi pognali program, ki izpiše seznam
datotek, vtipkali ls
. Ukazna lupina uporabi vgrajena pravila
in ob njihovi pomoči ugotovi, da želimo izvesti datoteko
/bin/ls. Zato s sistemskim klicem posreduje jedru
zahtevek, naj požene datoteko /bin/ls. To ga požene kot
proces potomec ukazne lupine (ki je zahtevala njegovo ustvarjenje), in
na potomca prestavi pravice za dostop do tipkovnice in zaslona. Dokler ukazna lupina
/bin/ls ne opravi svojega, spi, na zaslon pa
se izpisuje izhod procesa potomca.
Ko /bin/ls konča, novico o koncu s sistemskim klicem exit sporoči jedru. Jedro prebudi spečega roditelja in mu vrne pristojnosti za dostop do tipkovnice in zaslona. Ukazna lupina izpiše pozivnik in spet čaka na novo vrstico ukazov.
Medtem ko se ukaz ls
izvaja, se lahko dogajajo še druge reči
(predpostavimo, da gre za zelo dolg seznam datotek): poženemo lahko
drugo navidezno konzolo, se prijavimo, poženemo igrico in
podobno. Ali pa, če je računalnik povezan v omrežje, lahko med tem, ko se
izvaja /bin/ls, pošilja ali sprejema pošto.