Sunteți pe pagina 1din 4

Interpretorul de comenzi Accesul primar la calculator se face printr-un program cu aparenta austera care citeste

comenzi de la tastatura, le interpreteaza si le executa. Dincolo de aceasta aparenta simpla se ascund posibilitati
sofisticate de combinare a programelor, fisiere de comenzi, moni-torizarea si controlul executiei. Shell-ul este
interfata primara a utilizatorului cu sistemul de operare. Un shell UNIX este în primul rand un interpretor de comenzi,
permitand executia bogatului set de utilitare UNIX. În al doilea rand, shell-ul este un limbaj de programare care da
posibilitatea combinarii acestor comenzi în activitati complexe. El ofera utilizatorului un control complet asupra
programelor: executia lor poate fi sincrona sau asincrona, intrarile si iesirile pot fi redirectate, mediul de executie
poate fi ajustat dupa dorinta. Pe langa utilitare (comenzi externe) sau programe utilizator (de aplicatie), un shell are si
un numar de comenzi interne (builtins) care implementeaza functionalitati imposibil sau dificil de obtinut altfel. Shell-
ul poate fi utilizat interactiv, cand comenzile sunt citite de la tastatura si rezultatele sunt afisate pe ecran. În mod
interactiv, utilizatorul beneficiaza de facilitati de editare a liniei de comanda, controlul executiei programelor sau
folosirea istoriei comenzilor anterior. În mod neinteractiv shell-ul citeste comenzi dintr-un fisier. Astfel, utilizatorul
poate folosi facilitatile de programare ale shell-ului: variabile, structuri de control (if, while, for), subprograme. Unul
din shell-urile traditionale Unix este Bash (acronim pentru Bourne- Again Shell, scris de Stephen Bourne. Toate
comenzile interne ale shell-ului sunt disponibile si în bash. Facilitatile de macroprelucrare sunt conforme cu POSIX
1003.2. Executia comenzilor Intrarea si iesirea standard Cele mai multe comenzi UNIX îsi executa prelucrarile citind
date din ceea ce se numeste intrarea standard (pe scurt stdin) si scriind rezultatul în ceea ce se numeste iesirea
standard (pe scurt stdout). Shell-ul aranjeaza lucrurile în asa fel încat intrarea standard sa fie tastatura si iesirea
standard sa fie ecranul. Sa luam un exemplu folosind cat. Aceasta citeste rand pe rand fisierele primite ca argumente
si scrie continutul lor în iesirea standard. Asadar, comanda CHIP:/home/nelu$ cat cuprins cap01 cap02 afiseaza pe
ecran continutul fisierelor cuprins, cap01 si cap02. Daca executam comanda fara parametri, cat va presupune implicit
ca trebuie sa citeasca din intrarea standard, asa ca va astepta sa in-troducem o linie de la tastatura, dupa care o va
afisa pe ecran, si tot asa pana vom tasta Ctrl+D, ceea ce semnifica sfarsit de fisier în cazul tastaturii:
CHIP:/home/nelu$ cat Prima linie introdusa Prima linie introdusa A doua linie introdusa A doua linie introdusa
CHIP:/home/nelu$ Sa consideram un alt exemplu, în care folosim comanda sort pentru a ordona liniile introduse de la
tastatura: CHIP:/home/nelu$ sort lamai portocale banane [Ctrl+D] banane lamai portocale CHIP:/home/nelu$ Am
reprezentat între paranteze drepte tastarea lui Ctrl+D, sfarsitul de fisier. Desigur, poate fi mai util sa memoram lista
ordonata a fructelor într-un fisier. Acest lucru se poate obtine prin redirectare, un procedeu prin care iesirea standard
este trimisa într-un fisier: CHIP:/home/nelu$ sort > lista_sortata lamai portocale banane [Ctrl+D] CHIP:/home/nelu$
Dupa cum se observa, lista nu mai este afisata pe ecran, ci este salvata în fisierul lista_sortata si, de exemplu, poate fi
afisa-ta cu comanda cat: CHIP:/home/nelu$ cat lista_sortata banane lamai portocale CHIP:/home/nelu$ Mai exista
cel putin un mod de a obtine acelasi lucru: vom memora lista fructelor în fisierul fructe cu ajutorul comenzii cat, apoi
vom sorta acest fisier cu comanda sort. CHIP:/home/nelu$ cat > fructe lamai banane portocale CHIP:/home/nelu$

sort < fructe > lista_sortata Bash este certificat de standardele GNU. Mai mult
decat regulile formale sunt exigentele programatorilor participanti la proiect. Redirectarea intrarii se face cu
caracterul „<". Practic vorbind sort < fructe este echivalent cu sort fructe, dar exemplul este ilustrativ. În ceea ce
priveste programul sort, în cazul redirectarii, el se comporta ca si cand ar citi de la tastatura. Shell-ul se ocupa de
redirectare, iar sort nu are habar de fisierul fructe. În cazul sort fructe, programul sort trebuie sa des-chida explicit
fisierul fructe. Astfel ajungem la un concept foarte familiar utilizatorilor de UNIX, si anume acela de filtru. Un filtru
este un program care citeste din intrarea standard, prelucreaza datele într-un anumit mod, si trimite datele prelucrate
în iesirea standard. Utilizand redirectarea, intrarea si/sau iesirea standard pot fi luate din/scrise în fisiere. Sort este un
filtru simplu, el sorteaza, apoi scrie în iesirea standard liniile citite din intrare. Cat este un filtru si mai simplu: el doar
copiaza intrarea în iesire. Prelucrari în conducta În exemplele de mai sus, cand am demonstrat utilizarea comenzilor
cat si sort ca filtre, am presupus ca datele de intrare sunt fie introduse de la tastatura, fie se afla într-un fisier. Un caz
mai inte-resant este acela în care datele de intrare ale unui program sunt rezultatul prelucrarii altui program. De
exemplu, daca dorim sa obtinem lista fisierelor din directorul curent sortata în ordine inversa putem sa redirectam
iesirea standard a comenzii ls într-un fisier si apoi sa sortam acest fisier cu pro-gramul sort, optiunea -r:
CHIP:/home/nelu/lucrare$ ls bibliografie cuprins documente text CHIP:/home/nelu/lucrare$ ls > lista_fisiere
CHIP:/home/nelu/lucrare$ sort -r lista_fisiere text documente cuprins bibliografie CHIP:/home/nelu/lucrare$
Metoda de mai sus necesita folosirea explicita a unui fisier intermediar temporar precum si executia succesiva a unor
comenzi. O solutie mai buna este oferita de shell si se numeste prelucrare în conducta, în limba engleza pipelining.
Prelucrarea în conducta permite sa se conecteze un sir de comenzi în care si o intrare este simbolizata de caracterul
„|". În exemplul urmator lista sortata este obtinuta prin conectarea în conducta a comenzii ls si a programului sort:
CHIP:/home/nelu/lucrare$ ls | sort -r Prelucrarea în conducta de mai sus este mai usor de tastat si,de multe ori,mai
eficient de executat. Un alt exemplu util de conducta este examinarea continutului unui director mare:
CHIP:/home/nelu/lucrare$ ls /usr/bin | less În acest exemplu, lista fisierelor din directorul /usr/bin este transmisa
programului de vizualizare less. În acest fel, lista poate fi examinata pe îndelete si eventual putem cauta anumite
fisiere în ea. Pentru a demonstra conectarea în con-ducta a mai mult de doua comenzi, vom dori sa exemplificam prin
afisarea ultimelor trei fisiere din directorul /usr/bin. Acest lucru presupune listarea directorului, sortarea în ordine
descrescatoare si afisarea primelor trei linii din rezultat: CHIP:/home/nelu/lucrare$ ls /usr/bin | sort -r | head -3 znew
zmore zless Ultima prelucrare este executata de comanda head -3, care pur si simplu afi-seaza primele 3 linii citite
din intrarea standard dupa care se opreste. Mai ramane de rezolvat un amanunt. Redirectarea iesirii standard într-un
fisier folosind „>" este distructiva, în sensul ca vechiul continut al fisierului (daca exista) se pierde. Sunt situatii în
care este de dorit sa adaugam la fisierul de iesire în loc sa-l rescriem. În aceste cazuri vom fo-losi semnul de
redirectare „>>". De exemplu: CHIP:/home/nelu$ ls doc > fisiere CHIP:/home/nelu$ ls txt >> fisiere Prima comanda va
crea fisierul fisiere în care va scrie continutul directorului doc. Comanda a doua va adauga la aceasta lista lista de
fisiere din directorul txt. Procese si job-uri De fiecare data cand executam un program se spune ca pornim un proces.
Un program în executie merita numele special de proces fie si pentru ca putem lansa în executie acelasi program în
acelasi timp de mai multe ori. Procesul ne permite sa distingem între diferitele executii ale aceluiasi program sau între
executiile programelor diferite. Exista o comanda numita ps care ne permite sa afisam procesele din sistem. De
exemplu: CHIP:/home/nelu$ ps PID TTY STAT TIME COMMAND 2611 p3 S 0:00 -bash 2622 p3 R 0:00 ps În aceasta
forma, comanda, probabil executata de nelu, afiseaza numai procesele a caror executie a fost comandata de nelu (sau
în numele lui!). În cazul de fata nu sunt multe: shell-ul bash si comanda ps. Lista cu date despre procese contine
printre altele, în prima coloana, cea cu numele PID, un numar care identifica procesul: identificatorul de proces
(Process IDentifier). Pentru o lista completa a proceselor pe care le executa sistemul putem tasta „ps -aux".

Homepage-ul lui Brian J.Fox, autorul bash-ului. Din punct de vedere al shell-ului,
un proces este un job. În cazul simplu, dar foarte frecvent, termenii de job si de proces sunt interschimbabili. Job este
termenul folosit în special în legatura cu posibilitatile oferite de shell pentru controlul executiei acestora. Uzual,
utilizatorul executa un singur job, ultima comanda introdusa de la tastatura. Exista însa multe situatii în care este util
sa putem comuta între mai multe joburi care se executa simultan. Unele prelucrari dureaza mult si nu fac nimic
interesant între timp. Ar fi placut sa putem juca un joc pana se termina. În alte situatii suntem nevoiti sa întrerupem
temporar o editare, sa executam cateva comenzi în shell dupa care sa reluam editarea. Foreground si background
Job-urile pot rula în foreground sau în background. Un singur job poate rula în foreground. Acesta este job-ul care
poate interactiona direct cu tastatura prin intermediul intrarii si iesirii standard. În background pot rula mai multe
joburi si, de obicei, acestea nu au nevoie de interactiunea cu utilizatorul. Exista posibilitatea sa suspendam un job.
Dupa suspendare, un job poate fi re-luat în foreground sau în background, dupa dorinta. Spre deosebire de
suspendare, întreruperea unui job (un proces în foreground este întrerupt cu Ctrl+C) produce efecte iremediabile:
procesul este distrus si nu mai poate fi reluat. Mai trebuie mentionat faptul ca apasarea lui Ctrl+C nu termina imediat
toate procesele: unele mai executa o scurta perioada de timp operatii necesare terminarii corecte. Altele pur si simplu
nu pot fi terminate cu Ctrl+C. Sa luam exemplul unui program simplu, yes. Executia lui produce un sir de „y" în
iesirea standard pana cand este oprit: CHIP:/home/nelu$ yes y y y y y Puteti distruge procesul cu Ctrl+C. Putem
scapa de plictisitorul sir de y redirectand iesirea standard a programului catre /dev/null. CHIP:/home/nelu$ yes >
/dev/null Fisierul special /dev/null se comporta ca o gaura neagra, capabila sa absoarba orice. În plus, am dori ca, în
timp ce yes ruleaza, sa mai facem si alte lucruri. În acest scop putem sa executam procesul în background. Un mod
de a rula un proces în background este sa scriem comanda care îl lanseaza în executie terminata cu caracterul „&".
De exemplu: CHIP:/home/nelu$ yes > /dev/null & [1] 2854 CHIP:/home/nelu$ Dupa cum se vede, primim înapoi doua
numere si apoi promptul shell-ului, semn ca putem sa executam si alte comenzi. Primul, scris între paranteze drepte,
reprezinta numarul job-ului. Shell-ul numeroteaza începand cu 1 toate job-uri-le în curs de executie. Al doilea este
iden-tificatorul procesului. Acesta este unic de la o încarcare de sistem la alta. Putem afisa starea job-urilor cu
comanda: CHIP:/home/nelu$ jobs erior este marcat cu un _ iar celelalte, în cazul în care exista, nu sunt marcate. O
prima deosebire între job-uri si procese se poate observa din rezultatul comenzilor jobs si ps. De exemplu, shell-ul
este un proces executat în beneficiul utilizatorului dar nu apare în lista de joburi. La fel si comanda ps. Terminarea
unui job se poate face cu comanda kill. Ca argument, comanda primeste caracterul % urmat de numarul job-ului:
CHIP:/home/nelu$ kill %1 CHIP:/home/nelu$ jobs [1] Terminated yes >/dev/null CHIP:/home/nelu$

Richard M.Stallman (RSM), presedintele FSF. A fondat proiectul


GNU în 1984. Este initiatorul si programatorul principal în produse majore cum este Emacs si GNU C. Comanda
urmatoare va afisa job-urile. Între timp, sistemul va afisa terminarea job-ului 1. În acest caz putem termina job-ul
distrugand procesul care îl constituie. În continuare vom analiza un caz doar putin mai complicat, care însa ne va
per-mite sa distingem între procese si job-uri. Putem conecta în conducta programul yes cu programul wc, care
numara caracterele, cuvintele si liniile din intrare, în speranta ca vom avea sansa de a numara caracterele y afisate.
CHIP:/home/nelu$ yes | wc & [1] 2999 CHIP:/home/nelu$ jobs [1]+ Running yes | wc & CHIP:/home/nelu$ ps PID TTY
STAT TIME COMMAND 2611 p3 S 0:00 -bash 2998 p3 R 0:00 yes 2999 p3 S 0:00 wc 3002 p3 R 0:00 ps
CHIP:/home/nelu$ jobs [1]+ Running yes | wc & Concluzia este ca ambele procese, yes si wc, fac parte din acelasi
job. Concluzia este întarita experimentand terminarea job-ului: CHIP:/home/nelu$ kill %1 CHIP:/home/nelu$ ps [1]+
Terminated yes | wc PID TTY STAT TIME COMMAND 2611 p3 S 0:00 -bash 3015 p3 R 0:00 ps CHIP:/home/nelu$
Afisarea proceselor arata ca nici yes, nici wc nu mai sunt active. Terminarea jobului produce distrugerea tuturor pro
ceselor din conducta. Pe de alta parte, terminarea unuia din procesele conductei poate avea diverse efecte. Încercati
mai întai distrugerea procesului wc: CHIP:/home/nelu$ yes | wc & 1] 3049 CHIP:/home/nelu$ ps PID TTY STAT TIME
COMMAND 2611 p3 S 0:00 -bash 3048 p3 R 0:06 yes 3049 p3 S 0:01 wc 3050 p3 R 0:00 ps CHIP:/home/nelu$ kill
3049 CHIP:/home/nelu$ [1]+ Terminated yes | wc CHIP:/home/nelu$ Asadar, daca distrugem ultimul proces din
conducta se termina tot job-ul. Sa încercam sa distrugem yes: CHIP:/home/nelu$ yes | wc & [1] 3059
CHIP:/home/nelu$ ps PID TTY STAT TIME COMMAND 2611 p3 S 0:00 -bash 3058 p3 R 0:01 yes 3059 p3 S 0:00 wc
3060 p3 R 0:00 ps CHIP:/home/nelu$ kill 3058 CHIP:/home/nelu$ 8544256 8544256 17088512 [1]+ Done yes | wc
CHIP:/home/nelu$ Nu trebuie neaparat sa ne surprinda ca, în sfarsit, am obtinut un rezultat: pana la terminare, yes a
scris un numar de 8544256 caractere „y". O alta metoda de a pune un job în back-ground este sa-l pornim în
foreground, sa-l suspendam si apoi sa îl reluam în background. Întai sa pornim job-ul în foreground:
CHIP:/home/nelu$ yes > /dev/null Suspendarea job-ului se face cu o combinatie speciala de taste, asemanator
terminarii: Ctrl+Z. [1]+ Stopped yes >/dev/null CHIP:/home/nelu$ Dupa suspendare, starea job-ului este afisata în
acelasi mod în care ar afisa-o comanda jobs. Job-ul suspendat nu are nici o activitate si deci nu consuma resurse
sistem. Dupa suspendare se observa ca obtinem promptul shell-ului. Putem relua executia executia job-ului in doua
feluri: in foreground cu comanda fg, sau in background cu comanda bg: CHIP:/home/nelu$ fg Yes>/dev/null Comanda
fg reia in foreground ultimul job suspendat. Comanda prin care a pornit job-ul este afisata si nu mai avem prompt
shell. Reluarea in background are efect diferit: CHIP:/home/nelu$ bg [1]+ yes >/dev/null & CHIP:/home/nelu$
Comanda afisata este terminata cu „&", semn ca este executata în background. În plus, vom obtine si promptul shell.
Cum suspendam un job din background? Trebuie mai întai sa-l aducem în foreground cu comanda fg si apoi sa îl
suspendam cu Ctrl+Z. În continuare,vom mai nota ca job-ul yes, chiar lansat în background: CHIP:/home/nelu$ yes &
va produce încontinuu sirul nesfarsit de „y" si, în lipsa redirectarii, îl va afisa pe ecran. O ultima nota: comenzile fg si
bg actioneaza implicit asupra ultimului job suspendat. Comanda jobs afiseaza acest job cu semnul +. Daca avem mai
multe joburi suspendate, putem sa-l reluam pe cel pe care îl dorim scriindu-i numarul prefixat cu % în argumentul
comenzilor fg sau bg. De exemplu: CHIP:/home/nelu$ fg %2 reia executia jobului 2 în foreground. Iar:
CHIP:/home/nelu$ bg %7 reia în background executia jobului cu numarul 7. Mai mult, putem utiliza numarul de job ca
în CHIP:/home/nelu$ %3 în locul comenzii echivalente CHIP:/home/nelu$ fg %3.
Dictionar alias _ un sinonim pentru o comanda; utilizatorii definesc alias-uri pentru prescurtarea unor comenzi
complexe sau pentru a da nume familiare unor comenzi frec-vent utilizate; blanc _ caracterul spatiu sau caracterul
tab; builtins _ comenzi interne ale unui shell; cod de retur _ exit status, indicator de iesire. O valoare returnata de o
comanda celui care o apeleaza, de exemplu shell-ului; comanda interna speciala _ comanda interna clasificata ca
special builtin de POSIX 1003.2; controlul joburilor _ mecanism prin care utilizatorul poate controla selectiv executia
proceselor: le poate suspenda sau le poate relua individual; cuvant _ unitate lexicala care nu este operator. cuvant
rezervat _ un cuvant cu înteles special pentru shell; de exemplu cuvintele rezervate if, for si while desemneaza
structuri de control de program ale shell-ului; filtru _ program care citeste date din intrarea standard si scrie datele
prelucrate în iesirea standard; multe comenzi UNIX sunt filtre; grup de procese _ o colectie de procese asociate care
au un unic identificator numit identificator (ID) de grup de procese; intrare standard _ locul de unde un program
citeste comenzi si date; în mod obisnuit este tastatura; iesire standard _ locul unde un program afiseaza mesaje sau
rezultate ale prelucrarilor; în mod obisnuit este ecranul monitorului; job _ fie un singur proces fi o conducta de
procese precum si celelalte procese derivate din conducta; nume sau identificator _ un cuvant care consta numai din
litere, cifre si caracterul underscore („_") si începe cu o litera sau cu underscore; numele identifica variabile sau
functii shell; operator _ operator de control sau operator de redirectare; pipe _ conducta; procedeu prin care iesirea
standard a unui program este conectata direct în intrarea standard a altui program; ansamblu de procese
interconectate în cascada prin acest procedeu; POSIX _ o familie de standarde pentru sisteme deschise bazate pe
UNIX; bash are a face cu POSIX 1003.2, standardele pentru shell si utilitare; proces _ un program în executie; spre
deosebire de programul în forma de fisier executabil, procesul are o stare a executiei; starea procesului este
informatia care face posibila suspendarea executiei si reluarea acesteia; redirectare _ procedeu prin care intrarii
(iesirii) standard a unui program i se atribuie o alta sursa (destinatie) decat cea implicita; script _ fisier de comenzi;
datorita fa-cilitatilor de programare deosebite, utilizatorul poate crea script-uri care sa implementeze comenzi foarte
puternice sau activitati complexe; semnal _ mecanism prin care nucleul sistemului de operare notifica un proces
despre evenimentele din sistem; procesele pot asocia semnalelor proceduri detratare; sesiune _ perioada de
executie a unui program; tipic, acest program este shell-ul de login, adica shell-ul care se lanseaza automat cand
accesul unui utilizator este validat de sistem; atunci o sesiune de lucru este asociata cu perioada în care utilizatorul
are acces la sistem; token _ unitate lexicala; secventa de caractere tratata ca un tot de catre shell; unitatile lexicale
sunt cuvinte sau operatori;
Ba c k

<cuprins.htm> <cuprins.htm>

S-ar putea să vă placă și