Egy Unix rendszermag szigorúan véve nem tartalmaz felhasználó-interakciót: a kernel csupán arra képes, hogy futtasson más programokat, illetve hozzáférést biztosítson a rendszer erőforrásaihoz - ezen szolgáltatásait azonban programozói szinten, ún. rendszerhívások ( system calls, vagy röviden syscalls) formájában kínálja. Már a rendszer indításakor szükség van tehát egy (illetve több) programra, amely biztosítja a bejelentkezés lehetőségét, illetve bejelentkezéskor is minden felhasználó számára el kell indítani egy programot, amely lehetővé teszi a felhasználó számára, hogy a rendszerrel kommunikáljon, más programokat indítson el stb. Ez a program a parancsértelmező vagy shell amely nem csinál mást, minthogy olvassa a felhasználó billentyűzetéről érkező parancsokat, és ezeket a kernel számára emészthető rendszerhívásokká alakítja, a végeredményről pedig a képernyőn tájékoztatja a felhasználót. Fontos megjegyezni, hogy ilyen szempontból a shell semmiféle speciális tulajdonsággal nem bír: tulajdonképpen bármely programot megadhatunk ún. default shell-nek (cifra magyarsággal alapértelmezés szerinti parancsértelmező). Ha azt akarjuk, hogy valamely felhasználó csak a "vi" szövegszerkesztőt legyen képes futtatni, állítsuk be számára default shell-ként a "vi" programot: ekkor bejelentkezés után rögtön a "vi" indul el, a szövegszerkesztés befejezése (a "vi"-ből kilépés) után pedig a felhasználó visszakerül a login: prompthoz. Sőt, olyan programot is megadhatunk default shell-nek, amely egyáltalán nem olvas a billentyűzetről és nem ír a képernyőre - bár szegény felhasználó számára a bejelentkezések nem lesznek túl érdekfeszítőek - a program lefutását is csak onnét veszi észre, hogy visszakerült a login: prompthoz. Egy hasznos információ: a rendszerből kilépni a shell promptnál a "logout" paranccsal lehet. Hasonló az "exit" parancs is, azonban ez csak az első, a "login shell" után indított shellekből indít el, a rendszerből teljesen kilépni "logout"-tal kell.
Általában persze nem valamilyen célprogramokat adnak meg shell-ként, illetve célprogramokat: shell céprogramokat, amelyek fő célja, hogy a felhasználót segítsék a rendszer használatában (ami más programok indítását jelent). A Unix hosszú története során a sokféle fejlesztő és felhasználó ízlését tükrözvén, többféle shell program alakult ki: a legelterjedtebbek: a legelső, az ősi "sh", a Bourne által megírt shell, amely egyfajta közös nevezőt jelent, mert minden Unix rendszer tartalmazza, aztán az sh továbbfejlesztett és C programozók ízlésvilágához igazított változata a "csh", a sokféle funkciót magában foglaló Korn shell, a "ksh", valamint a csh kényelmi és kiterjesztett funkciókkal jól megpakolt változata a "tcsh", és végül a Linux rendszereken általánosan használt "bash", a Bourne Again SHell, amely az sh egy alaposan továbbfejlesztett változata. A shell lehetőségei nem merülnek ki csupán interaktív parancs-futtatásban: mindegyik shell-nek egy saját kis programnyelve van, amelyben interpretált kis programocskákat (ún. shell script-eket) írhatunk. A shell script programozással később részletesen foglalkozunk majd.
A bash számos kényelmi funkciója közül néhány: Az előzőleg begépelt parancsokat visszahívhatjuk a felfelé nyíllal, a parancssort szabadon szerkeszthetjük (mozogni a nyílbillentyűkkel lehet). Előző parancsot visszahívni még a felkiáltójellel is lehet: a ! mögé rövid sztringet írva megkeresi a legutóbbi olyan parancsot, amely azzal a sztringgel kezdődött, és azt futtatja le. A ! használatával előhívott parancs egyébként módosítható, át is szerkeszthető. File-név kiegészítést a "Tab"-bal kérhetünk: ennek hatására a shell megpróbálja kiegészíteni az eddig begépelt file-név kezdeményt. Ha ez egyértelműen lehetséges, beírja a file-nevet, ha nem, sípol egyet, és a "Tab" újbóli megnyomására megkapjuk a lehetséges file-nevek listáját. A file-név kiegészítés valamennyire intelligens: sor elején (első szóban) csak futtatható file-okra, parancsok nevére egészít ki (viszont a PATH-ot is végignézi), argumentumoknál viszont az aktuális jegyzék (vagy a megkezdett file-névnek megfelelő jegyzékr) összes file-jára működik.
Még két, a bash-hoz tartozó file-ról érdemes beszélnünk, mindkettő a home jegyzékünkben van, és shell parancsokat tartalmaz, amelyeket a bash bizonyos körülmények között végrehajt. Az első a .profile, amelyet bejelentkezéskor hajt végre a rendszer, a másik pedig a .bashrc, amelyet minden bash indításkor (tehát akkor is, ha már bejelentkezünk és újabb shellt indítunk). A .profile-ban szokás például a PATH és más globális változók értékét saját ízlésünk szerint konfigurálni, a .bashrc-ben pedig például "alias"-okat definiálhatunk: "alias"-ok segítségével parancsoknak más neveket adhatunk, hosszú parancsoknak rövideket vagy nehezen megjegyezhető nevűeknek valami memorizálhatóbbat. DOS mániákusok például írhatják a következőt:
claudius:~$ alias dir='ls -l'
Ezután a "dir" parancs jelentése "ls -l" lesz. Az eddig (vagy előre) definiált alias-okat a paraméterek nélkül kiadott "alias" paranccsal nézhetjük meg, egy alias-t kitörölni pedig az "unalias alias_nev" paranccsal lehet. "Folytatható" alias-t (ahol az alias helyettesítése után az alias név után írt szavakat is továbbviszi a shell), az alias végére írt $* szimbólummal definiálhatunk.
-l -lel (long listing) minden egyes file-ról "bő" (verbose) információt kaphatunk. Az egyes mezők jelentése: A legelső karakter a file típusára utal:
(A b,c,s típusú file-okat később majd tárgyaljuk: egyenlőre fogadjuk el, hogy ilyenek is vannak).
A következő 3*3 karakter a file hozzáférési jogosultságait adja meg: az első három karakter jelenti, hogy a file tulajdonosa mit tehet a file-lal:
A kövekező három karakter ugyanilyen formában jelenti a file-tulajdonos csoport (group) jogait, vagyis hogy a file tulajdonos csoportba tartozó felhasználók mit tehetnek az adott file-lal, az utolsó három karakter pedig a külvilág (others), az egyéb felhasználók jogait jelenti. A file tulajdonosa természetesen tetszés szerint megadhatja a hozzáférési jogokat, nemsokára látni fogjuk hogyan. Azt tehát, hogy egy file futtatható-e (az operációs rendszer megkísérelheti-e futtatni) Unix alatt nem kiterjesztés, vagy más egyéb file-névbe olvasztott információ dönti el, hanem a megfelelő x attribútum. Az is igaz, hogy ha egy file-ra csak x jogunk van, akkor csak futtatni fogjuk tudni azt a file-t, olvasni nem - tehát nem fogjuk tudni lemásolni sem! Mint már láttuk, szöveges file is lehet futtatható: a shell parancsokat tartalmazó shell script-ek is egyszerű szöveges file-ok, beállított x attribútummal. Ha egy ilyen file-t indítunk el, a shell egyszerűen soronként olvassa és hajtja végre a beleírt utasításokat, hasonlóan a DOS-os .BAT file-okhoz. A végrehajtási jog ("x") katalógusok esetén a katalógusban való keresés jogát jelenti. Ha valamely műveletünk megfelelő jogosultságok hiányában meghiúsul, a sokat átkozott "Permission denied." hibaüzenetet láthatjuk.
A jogok után következő mező a sorban az úgynevezett link számláló (link count): megadja, hogy az adott filesystem-en hány hard link mutat az adott file-ra (tulajdonképpen megmondja, hogy hány néven hivatkozhatunk a file-ra). Ez a számláló csak a hard linkek számát mutatja - szimbolikus linkek számolására nincs lehetőség.
A következő mező a file tulajdonos user-neve (jelen esetben "tiv"), a következő pedig a tulajdonos csoport azonosítója ("users"). Ezután a file hossza következik byte-okban, majd az ún. "mtime" mező, a file utolsó módosításának dátuma. Legvégül a file neve látható. Szimbolikus linkeknél (a fenti példában a "vmessages" file ilyen) a -l opció hatására egy -> nyíl után az ls kiírja, melyik másik file-ra mutat a szimbolikus link.
Azon a problémán, hogy egy géphez csak egy monitor és egy billentyűzet tartozik, úgy próbál a Linux segíteni, hogy több ún. virtuális konzolt használhatunk, amelyek mindegyike úgy viselkedik, mintha a rendszer konzol terminálja lenne. A virtuális konzolok számát a rendszergazda konfigurálhatja, közöttük a bal Alt+funkcióbillentyűkkel illetve a bal Alt + jobbra/balra nyíl billentyűkkel válthatunk.
Nagyon hasznos funkció a Shift+PageUp/PageDown, amellyel - virtuális konzolon - pár oldalnyi szöveget görgethetünk oda-vissza. Az éppen futó processzt a "Print Screen" megnyomásával is kilőhetjük, ha az esetleg a ^C-re nem reagálna. Az operációs rendszert újraindíthatjuk a jól ismert Ctrl-Alt-Del kombinációval (természetesen csak konzolról!) - ezt "shutdown" procedúraként, a gép kikapcsolása előtt is használhatjuk, ugyanis gondosokdik a bufferek diszkre írásáról, a folyamatok kultúrált lezárásáról stb.