0% au considerat acest document util (0 voturi)
39 vizualizări35 pagini

Unix

Încărcat de

lifestyle85
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
39 vizualizări35 pagini

Unix

Încărcat de

lifestyle85
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOC, PDF, TXT sau citiți online pe Scribd

UNIX-notiuni de baza

Aceasta sectiune incearca sa prezinte citeva notiuni de baza despre un sistem de operare
care, desi a aparut in anii '70, a dat "idei" multor creatori de sisteme de operare si a
inceput sa se impuna din ce in ce mai mult ca solutie fiabila si ieftina pentru
interconectarea sistemelor de calcul. Scopul prezentarii sistemului Unix este acela de a
invata ceva folositor pentru activitatea fiecaruia in Centrul Judetean de Informatica, de a
mai aduce in laborator pe cei care nu si-au folosit conturile de luni intregi si...(alte motive
mai puteti gasi si singuri). In plus, de ce sa nu spunem, se pot castiga bani frumosi din
administrarea unei retele...

PREZENTARE GENERALA
1.1 Scurt istoric al sistemului Unix
1.2 Caracteristicile sistemului Unix
1.3 Structura sistemului Unix
1.1 Scurt istoric al sistemului Unix

Prima versiune de UNIX a fost elaborata in 1969 de Ken Thompson si Denis Ritchie in
grupa de cercetare de la Bell Laboratories, fiind scrisa pentru a rula pe un calculator PDP-
7. A doua versiune a fost scrisa pentru calculatorul PDP 11/20.

A treia versiune, inca necomerciala, este scrisa complet in limbajul C, pentru calculatoare
PDP 11/45, a aparut in 1973. Apar pentru prima data facilitatile legate de
multiprogramare. Prima versiune comerciala este V6 si a aparut in 1976.

Versiunea V7, aparuta in 1978, putea lucra pe calculatoare PDP 11/70, Interdata 8/2 si pe
minicalculatoarele VAX 32V. Versiunea a fost distribuita gratuit in universitatile din
SUA, la nivel de cod sursa, fapt care a stimulat cercetarea in domeniul sistemelor de
operare si a adus popularitatea sistemului UNIX. In aceasta perioada apar primele actiuni
organizate de a standardiza sistemul Unix, care devine nu numai obiect de cercetare dar si
produs. Firma AT&T creaza grupul USG (Unix Support Group), care isi asuma controlul
si responsabilitatea de a distribui Unix-ul. Prima versiune distribuita de acest grup este
Unix System III, care a aparut in 1982.

O puternica influenta asupra dezvoltarii sistemului Unix a avut-o, pe linga Bell si AT&T,
Universitatea California din Berkely, care a dezvoltat versiunile BSD-3 si BSD-4. Aceste
versiuni contin facilitati pentru gestiunea memoriei virtuale cu paginare si facilitati de
lucru in retele. A fost creata interfata utilizator C-Shell, s-au introdus noi editoare de texte
(VI si EX) si compilatoare pentru Pascal si Lisp.
Distribuirea libera a surselor sistemului Unix a dus si la aparitia unui mare numar de
versiuni si chiar la "dispute" intre grupurile puternice pentru standardizarea sa intr-o
forma sau alta. Pe linga Versiunea 8, System V si BSD putem aminti alte versiuni (dintre
care unele nu realizeaza decit o functionalitate tip UNIX) ca: ULTRIX, XENIX, AIX,
VENIX, ZEUS, HP-XX, SOLARIS.

Una dintre cele mai folosite "arome" Unix este sistemul Linux, care are si o foarte
interesanta istorie, fiind un exemplu de colaborare a mii de necunoscuti, uniti doar de
pasiunea pentru calculatoare si de dorinta de a dispune de un software bun si ieftin
( gratis, daca se poate).Initiatorul, daca putem spune asa, a fost studentul finlandez Linus
Torvalds. Incercind sa transfere niste fisiere prin retea (chestia se intampla in 1991, cand
Linus cumparase primul PC) si-a dat seama ca MsDos-ul nu putea sa-l ajute prea mult asa
ca... a trecut la lucru (era destept tipul, nu ?).

"Trebuia sa scriu un driver de disc. L-am scris. Apoi a trebuit sa concep


un sistem de fisiere, pentru a putea citi si scrie fisiere pe sistemul central
Minix. Toate operatiile trebuiau sa se desfasoare simultan, deci aveam nevoie
de multitasking. Dar ce altceva decit Unix este un sistem de operare multitasking,
cu sistem propriu de fisiere si drivere pentru periferice. "

Astfel a aparut nucleul sistemului Linux, iar entuziastii l-au completat, depanat si au
contribuit la dezvoltarea versiunilor ulterioare. Linux poate fi copiat , modificat si
distribuit liber. Nu se pot pune restrictii asupra distributiei, iar sursele trebuie sa fie mereu
disponibile pentru oricine doreste sa le compileze sau sa le modifice. Pentru a obtine o
distributie Linux (RedHat, Slackware, Debian) pe suport magnetic nu se achita decit
costul suportului. Versiunile Linux apar destul de des, deci este greu sa fi la curent cu
ultimele noutati. Cei care doresc sa se implice intr-un proiect de realizare a unor
documentatii legate de Linux pot afla mai multe informatii din pagina administrativa a
laboratorului ( a nimerit orbul Braila, deci o persoana interesata nu poate sa nu gaseasca
ceea ce cauta...).

1.2 Caracteristicile sistemului Unix

Sistemul UNIX este un sistem de operare cu destinatie generala, multiutilizator,


multiproces, lucrind in regim time-sharring. Dintre caracteristicile care-l fac atractiv
enumeram urmatoarele:

• Este un sistem de operare cu o interfata relativ simpla, avand numeroase


programe utilitare, care acopera o gama larga de aplicatii (retele, grafica, baze da
date , inteligenta artificiala). Sunt disponibile compilatoare si medii de
programare pentru limbaje de programare de nivel inalt (Basic, Fortran 77, Pascal,
C, Lisp, Prolog)
• Unix este un sistem multiutilizator, permitind lucrul simultan dde la mai multe
terminale
• Este un sistem portabil, putind fi implementat pe diferite tipuri de calculatoare
• Unix are un sistem de fisiere arborescent, cu fisiere organizate simplu (sir de
octeti) si grupate in directoare.
• Unix dispune de un sistem de intrare/iesire generalizat, care trateaza identic
fisiere, periferice, memoria si comunicatiile interproces
• Unix are un mecanism simplu de gestiune a memoriei, folosind conceptul de
memorie virtuala, asigurind un nivel inalt de multiprogramare.
• Unix dispune de un sistem eficient de protectie a informatiei, folosind parole si
drepturi de acces
• Unix are o interfata utilizator simpla, numita SHELL, care se poate extinde la
nivelul unui limbaj de programare de nivel inalt, de tip C, cu un interpretor de
comenzi diferit de nucleu (utilizatorul poate incarca interpretorul de comenzi pe
care-l doreste).
• Procesele Unix sunt reentrante (procesele care au partea de cod identica folosesc o
singura copie a codului, rezidenta in memorie)

1.3 Structura sistemului Unix

Sistemul de operare Unix contine un nucleu (partea rezidenta) si un mare numar de


programe utilitare accesibile prin intermediul interpretorului de comenzi. Interfata tuturor
acestor utilitare si a programelor utilizator cu nucleul se realizeaza prin intermediul unui
ansamblu de functii sistem. Utilizatorul are trei niveluri de acces la sistem:

• prin intermediul utilitarelor (nivel extranucleu);


• prin functii de biblioteca standard a limbajului C (nivelul intermediar);
• prin directive sistem (nivel scazut);

Nucleul este intermediarul intre interfata furnizata de apelurile sistem si echipamentele


fizice. Nucleul realizeaza:

• gestiunea fisierelor;
• gestionarea memoriei;
• planificarea proceselor pentru executie;

Apelurile sistem definesc interfata programator. Apelurile sistem sunt de trei categorii:

• pentru manipularea fisierelor (perifericelor);


• pentru controlul executiei proceselor;
• pentru manipularea informatiei;

SISTEMUL DE FISIERE

• 2.1 Sistemul de fisiere


• 2.2 Notiunea de fisier
• 2.3 Structura sistemului de fisiere. I-noduri
• 2.4 Structura arborescenta a directoarelor
2.1 Sistemul de fisiere

Datele si programele sunt pastrate, ca si in alte sisteme de operare, in fisiere memorate pe


discuri magnetice. Fiecare disc poate fi impartit, din punct de vedere logic, in mai multe
zone numite partitii. Marimea unei partitii este stabilita de catre administratorul de
sistem la instalarea sistemului sau cand se introduce un nou disc in sistem. Fiecare
partitie este gestionata in mod separat de sistemul de operare ca si cum ar fi un dispozitiv
independent.

Pentru gestionarea fisierelor dintr-o partitie, sistemul de operare trebuie sa detina


informatii despre: blocurile de date libere din cadrul partitiei, blocurile de date ocupate ,
informatii cu privire la fiecare fisier continut de acea partitie. Toate informatiile de
organizare a sistemului de fisiere trebuie sa se gaseasca in partitia in care a fost creat
sistemul de fisiere. Pe parcursul evolutiei sale, in Unix au fost definite mai multe sisteme
de fisiere, acestea diferind prin dimensiunea blocurilor de date , prin informatiile
continute si prin structurile de date utilizate pentru gestionarea fisierelor. Exemple de
sisteme de fisiere: s5 (UNIX System V), ufs (BSD UNIX), rsf si nsf (pentru retelele de
calculatoare).

Pentru a realiza coexistenta mai multor sisteme de fisiere diferite, nucleul sistemului de
operare contine un nivel special, numit sistem virtual de fisiere, avand rolul de a
uniformiza accesul la fisiere. Apelurile operatiilor cu fisiere primite de la utilizatori sunt
tratate la acest nivel, care particularizeaza apelul in functie de sistemul de fisiere in care
se afla fisierul apelat.

2.2 Notiunea de fisier in acceptiune Unix

In Unix fisierul este considerat ca fiind o succesiune de octeti, avand un marcaj de sfarsit
de fisier. Exista trei tipuri de fisiere:

• fisiere ordinare
• fisiere director
• fisiere speciale

Un fisier ordinar este folosit pentru memorare de informatii pe suport magnetic; el poate
contine un program sursa (text) sau unul sub forma de cod executabil (binar), precum si
date necesare executiei programelor. Fisierele ordinare sunt singurul tip de fisiere folosite
pentru memorarea pe termen lung a informatiilor. Numele fisierelor nu pot depasi 14
caractere tiparibile in sistemele Unix mai vechi si 255 de caractere in versiunile mai
recente. Caracterele permise sunt literele mari si mici ale alfabetului englez, cifrele si
semnul _ . Literele mari si literele mici sunt considerate distincte. Uneori este necesar ca
numele fisierului sa aiba o extensie: .sh pentru programe Shell, .bas pentru programe
Basic, .c pentru programe C, e.t.c

Dirctoarele sunt fisiere care contin infornmatii despre subdirectoarele si fisierele


continute. Fisierele speciale sunt fisiere asociate dispozitivelor periferice. Utilizatorii pot
efectua schimburi de date la periferice fara a fi nevoiti sa cunoasca detalii despre
mecanismul de functionare a acestora.

2.3 Structura sistemului de fisiere. I-noduri

Reprezentarea interna a unui fisier si informatiile referitoare la carcateristicile sale sunt


continute de o structura de date numita i-nod (information node), care contine date
despre: pozitia pe disc a datelor din fisier, proprietarul fisierului, drepturile de acces,
momentul ultimului acces la fisier sau ultima modificare a fisierului sau I-nodului. Un
fisier poate avea mai multe nume, dar exista un singur i-nod asociat. Relatia stabilita intre
nume si i-nod se numeste legatura . Fiecare i-nod are asociat un numar de ordine (i-
number ) ce desemneaza in mod unic numele interne ale fisierelor, iar cataloagele contin
numai tabela de traducere a numelui extern al fisierului in numarul de ordine asociat.

Cand un proces creeaza un nou fisier, nucleul asociaza acestuia un i-nod liber al carui
numar de ordine devine identificatorul intern al fisierului si creeaza o noua intrare in
catalogul corespunzator. I-nodurile sunt memorate in sistemul de fisiere dar, pentru a
micsora timpul de executie a operatiilor care necesita informatii despre fisiere, o copie a
tabelei de i-noduri este pastrata in memoria interna. Nucleul sistemului de operare
contine urmatoarele structuri de date: o tabela de fisiere ,cate o tabela de descriptori de
fisier pentru fiecare proces. Tabela descriptorilor de fisier identifica toate fisierele create
sau dezchise de un anumit proces. Tabela de fisiere inregistreaza, pentru fiecare fisier,
pozitia in octeti de la care se va face urmatoarea operatie de citire sau scriere asupra
fisierului. In momentul in care procesul va lansa o comanda de deschidere sau creare de
fisier, nucleul sistemului de operare ii va intoarce indexul fisierului din tabela
descriptorilor de fisier alocata acelui proces. Daca procesul lanseaza o comanda de
scriere/citire asupra fisierului, comanda va contine ca argument si acest index, pe baza
caruia sistemul de operare va identifica descriptorul acelui fisier, apoi pozitia sa in
sistemul de fisiere si in cele din urma i-nodul asociat (din informatiile cuprinse in i-nod
se identifica zona de date a fisierului.

Un i-nod contine toate informatiile cu privire la un fisier (mai putin numele sau), cum ar
fi:

• tipul fisierului
• drepturile de acces
• identificatorul proprietarului fisierului
• identificatorul grupului caruia apartine fisierul
• marimea fisierului
• data si ora ultimei accesari a fisierului
• data si ora ultimei modificari a fisierului
• data si ora crearii fisierului
• tabel de adrese de disc a blocurilor ce compun fisierul (in cazul unor blocuri de
512 octeti, marimea fisierului poate ajunge la 1 Go
Un sistem de fisiere este compus dintr-o secventa de blocuri logice, marimea acestora
fiind un multiplu de 512 octeti (marimea blocului depinde de implementarea sistemului).
Structura generala a sistemului de fisiere este urmatoarea:

*****************************
* Bloc pentru incarcarea *
* sistemului de operare *
*****************************
* Superbloc *
*****************************
* Lista de i-noduri *
*****************************
* *
* *
* Blocuri de date *
* *
* *
*****************************

Blocul de incarcare ocupa, de obicei, zona aflata pe primul sector al discului si contine
procedurile de incarcare ale sistemului de operare. Desi este considerata zona a
sistemului de fisiere, nu este folosita practic de acesta.

Superblocul ocupa urmatoarele sectoare de pe disc si contine informatii referitoare la


sistemul de fisiere, cum ar fi:

• Marimea si starea sistemului de fisiere(eticheta, numele sistemului de fisiere,


marimea blocurilor, data si ora ultimei modificari a superblocului)
• Informatii cu privire la i-noduri (numar total de i-noduri alocate, numarul de i-
noduri libere...)
• Blocurile de memorie (numarul total de blocuri libere, tabel cu numerele a 50 de
blocuri libere si un index in acest tabel)

Lista de i-noduri cuprinde informatii cu privire la fiecare i-nod din sistem, marimea sa
fiind specificata in momentul configurarii sistemului de fisiere. Nucleul sistemului de
operare se refera la i-noduri prin indexul acestora din tabela de i-noduri. Unul dintre i-
noduri este radacina sistemului de fisiere, prin acesta fiind disponibila structura de
cataloage a sistemului de fisiere.

Blocurile de date incep imediat dupa lista de i-noduri si contin datele din fisiere sau date
administrative. Un bloc de date nu poate apartine, la un moment dat, decat unui singur
fisier.

2.4 Structura arborescenta a directoarelor

Directorul este un fisier care contine, pentru fiecare fisier, numele extern al fisierului si i-
number-ul asociat acestuia, pe baza caruia se identifica i-nodul fisierului (directorul
contine tabela de traducere nume-identificator intern). Directoarele formeaza o structura
arborescenta, avand ca radacina un unic director numit root si notat cu simbolul /. Fiecare
director continefisierele cu numele . si .. care identifica i-nodul propriu al directorului,
respectiv i-nodul directorului parinte.

Structura generala a arborelui cataloagelor (putin simplificata, fireste) este urmatoarea:

root
|
--------------------------------------------
| | | | | | | |
adr bin dev etc mdec sys tmp usr
|
|
----------------------------
| | | | | |
bin man doc spool lib users
|
|
-----------------
| | |
user_1 user_2
...user_n

Aceasta structura este tipica pentru toate sistemele Unix, principalele directoare sistem
fiind urmatoarele:

• /bin -care contine utilitarele uzuale (format executabil);


• /dev -contine fisierele speciale asociate perifericelor;
• /etc -contine utilitarele speciale de intretinere, folosite doar de administrator,
fisierul de parole, de grupuri,etc;
• /tmp -contine fisiere temporare folosite de editor, compilatoare;
• /lib -contine biblioteca de limbaje
• /usr -este cel mai mare director al sistemului, cu subdirectoarele:
o bin -utilitare mai rar folosite
o man&doc -manuale si documentatie
o spool -fisiere pentru imprimanta si posta electronica
o users -contine cate un director pentru fiecare utilizator conectat la sistem

Specificarea unui fisier se face prin specificarea caii de acces prin:

• specificare absoluta -calea pleaca din root, indicandu-se toate nivelele arborelui
pana la fisierul desemnat
• specificare relativa ,cand calea pleaca din directorul curent

Comenzile de gestionare a fisierelor si directoarelor vor fi date in sectiunea urmatoare.


Mecanismul de protectie al fisierelor este simplu insa foarte eficient. Fiecare fisier
contine in i-nodul asociat drepturile de acces la acel fisier. Exista trei tipuri de acces la un
fisier:

• read (r) -dreptul de vizualizare a continutului (deschiderea cu comanda ls pentru


fisierele director)
• write (w) -dreptul de modificare a fisierului (dreptul de creare si stergere de
fisiere pentru directoare)
• execute (x) -permite incarcarea fisierului in memorie si executarea codului
continut (permisiunea de a cauta in director in cursul prelucrarii unei cai de acces)

Exista trei categorii de utilizatori:

• proprietar (u) -cel care a creat fisierul


• grup (g) -mai multi utilizatori din acelasi compartiment de lucru
• ceilalti utilizatori (o)

Sistemul de protectie al fisierelor mentine informatii despre drepturile de acces pe care le


are fiecare categorie de utilizatori. Schimbarea drepturilor de acces se face prin comanda
chmod , care va fi detaliata in sectiunea urmatoare.

PROCESE UNIX. INCARCAREA SISTEMULUI DE OPERARE

• 3.1 Notiunea de proces. Incarcarea sistemului de operare


• 3.2 Caracteristicile unui proces Unix

3.1 Notiunea de proces. Incarcarea sistemului de operare

Exercitiu: Incercati sa va amintiti, fara sa apelati la caiet, definitia procesului.

Sistemul de operare Unix are drept concept fundamental conceptul de proces. Procesul
poate fi definit, in prima instanta, ca fiind un program in executie (daca stiti ce este acela
un proces, sunati la 8989899 si spuneti ce este un proces !). Procesul este o entitate
dinamica, in timp ce programul este o entitate statica. Pentru un program executabil dat
pot exista mai multe procese asociate, numite instante . Caracteristica cea mai importanta
a unui proces este identificatorul procesului (PID). Acesta este un numar natural nenul
prin care se identifica in mod unic procesele, mai precis locul unde sunt memorate
caracteristicile procesului din tabela proceselor. Procesele sunt de doua tipuri: procese
utilizator si procese nucleu.

Incarcarea sistemului de operare Unix se face astfel:

• Se initializeaza structurile de date proprii (ale nucleului);


• Se monteaza sistemul de fisiere
• Se creaza procesul 0, numit swapper, care este planificatorul de procese El face
parte din nucleu si este considerat proces sistem.
• Se creaza procesul 1, numit init , care este parintele tuturor proceselor aparute
ulterior in sistem;
• Se executa procesul init care initializeaza structurile proprii de date, apoi citeste
fisierul /etc/inittab pentru a decide asupra proceselor ce vor fi create si fisierul
/etc/rc pentru a lansa procesele sistem care ruleaza in memorie pe durata intregii
functionari a sistemului, numite procese background sau demoni . Procesul init
citeste fisierul /etc/ttys pentru a determina numarul terminalelor din sistem si
creaza cate un proces fiu pentru fiecare terminal. Dupa aceea, procesul init trece
in starea blocat pana la terminarea unuia dintre procesele fiu. Fiecare proces fiu
asociat unui terminal executa programul login care solicita introducerea numelui
si parolei utilizatorului. Datele introduse sunt verificate prin compararea cu datele
din fisierul /etc/passwd. Daca utilizatorul are acces la sistem, atunci acest proces
fiu lanseaza interpretorul de comenzi ales de utilizator. In caz contrar, programul
login solicita reintroducerea numelui si parolei.

Observatie: Procesul 0 se numeste sheduler pentru sistemele cu paginare si swapper


pentru sistemele cu evacuare.

3.2 Caracteristicile unui proces

Dupa cum aminteam ceva mai inainte, un proces utilizator poate sa se execute in mod
utilizator si in modul nucleu . In modul utilizator procesele nu au acces decit la propria
zona de cod, date si stiva utilizator. In modul nucleu un proces contine instructiuni
privilegiate si poate avea acces la structurile de date ale nucleului. Nucleul, in termeni de
procese, nu este un proces separat ci devine parte integranta a procesului utilizator.
Spatiul virtual de adrese al unui proces este cuprins intre 0 si adresa virtuala maxima
accesibila procesului si are trei segmente: segmentul de cod, segmentul de date si
segmentul de stiva.

Procesele iau nastere, sunt executate si dispar prin folosirea unor apeluri sistem (functii
sistem). Orice proces Unix, cu exceptia procesului 0, este creat prin apelul functiei sistem
fork. Procesul nou creat se numeste proces fiu, iar procesul care a apelat functia fork se
numeste proces parinte. Initial, imaginile celor doua procese in memorie sunt identice,
apoi ele pot avea propria imagine in memorie. Procesul fiu poate executa acelasi cod sau
altul. Fisierele deschise de procesul parinte inainte de apelul fork vor fi partajate intre
parinte si fiu. Pentru executarea codului se foloseste functia exec. Mecanismul executarii
unei comenzi shell este urmatorul:

• Shell-ul citeste linia de comanda si desparte comanda de argumentele sale;


• Se apeleaza functia fork in urma careia vor aparea cele doua procese:parintele
(procesul care executa codul shell-ului) si fiul (procesul ce va executa comanda
respectiva);
• Procesul parinte printr-un apel al functiei wait cedeaza procesorul fiului si intra in
starea de asteptare;
• Procesul fiu lanseaza un apel exec prin care executa un nou program (comanda
data). Nucleul incarca in zona de memorie a shell-ului noul program, iar procesul
este continuat cu acest program, caruia ii sunt transmise argumentele;
• La incheierea executiei programului se apeleaza functia sistem exit, care
determina terminarea procesului fiu si reda controlul procesului parinte (acesta
iese din starea de asteptare); Dupa terminarea sa, procesul fiu intra in starea
zombie: desi s-a terminat, numai procesul parinte poate elimina procesul fiu din
tabela proceselor.

Operatiile cele mai importante, realizate de nucleu prin apelul functiei fork sunt:

• Aloca o noua intrare in tabela proceselor;


• Asociaza un descriptor unic procesului fiu;
• Realizeaza o copie logica a imaginii memoriei parintelui;
• Comunica parintelui descriptorul de proces al fiului;
• Trece procesul fiu in starea intrerupt (in memorie sau evacuat pe disc);

In Unix exista mecanisme prin care se realizeaza sincronizarea proceselor, folosindu-se


mai multe tipuri de semnale ce pot fi schimbate intre procese. Nu este cazul sa detaliem
acest aspect (poate anul viitor cand veti putea programa in limbajul C), dar voi aminti
doar functia kill care trimite semnale de terminare catre procese (mai multe amanunte in
capitolul urmator).

Daca ati citit cu destula atentie lectiile de pana acum veti putea sa raspundeti corect
intrebarilor cuprinse in Testul nr. 1

1. Cum se numeste procesul folosit la conectarea in sistem ?


login
passwd
init
2. Cum se numeste procesul parinte al tuturor proceselor din sistem ?
swapper
init
demon
3. Cum se numesc procesele care se activeaza la aparitia unui eveniment ?
demoni
procese fii
procese zombie
4. Un proces ia nastere prin apelul functiei sistem...
WAIT
EXEC
FORK
5. Un proces fiu nu are acces la
fisierele deschise de parinte
nici un fisier din sistem
fisierele deschise de ceilalti fii ai procesului parinte
6. Procesul ruleaza in mod nucleu atunci cand...
realizeaza un apel de sistem sau apare o intrerupere de ceas
se afla evacuat pe disc
se afla in starea READY PREEMPTAT
7. Procesul care si-a incheiat executia dar apare in tabela proceselor este
proces ORFAN
proces ZOMBIE
proces SISTEM
8. Ce semnifica prescurtarea PID ?
identificatorul procesului
nu are semnificatie
identificatorul parintelui unui proces

COMENZI UNIX

• 4.1 Interfata utilizator


• 4.2 Comenzi pentru gestiunea directoarelor
• 4.3 Comenzi pentru gestiunea fisierelor
• 4.4 Comenzi pentru gestiunea proceselor
• 4.5 Comenzi informationale si pentru terminale

4.1 Interfata utilizator

Dupa ce procesul login a aflat numele utilizatorului si a verificat corectitudinea parolei, el


schimba catalogul curent cu directorul respectivului utilizator (indicat in fisierul
/etc/passwd) si lanseaza in executie programul al carui nume figureaza in ultimul camp al
aceleiasi intrari in /etc/passwd. Acest program este, de obicei, un interpretor de comenzi.
Lansarea sa in executie are loc fara crearea unui proces nou, procesul login fiind practic
inlocuit cu noul program.

Interpretorul de comenzi lucreaza asemanator interpretoarelor de comenzi din sistemele


de operare cunoscute deja:afiseaza un prompt, preia comanda si argumentele si, daca
acea comanda este comanda interna o executa; in caz contrar numele comenzii este
folosit pentru identificarea unui fisier executabil care este incarcat si executat. Dupa
terminarea executiei comenzii reapare promptul ce invita utilizatorul sa introduca o noua
comanda. In termeni de proces, mecanismul de executie al comenzilor a fost prezentat in
capitolul precedent.

Observatie: Spre deosebire de alte sisteme de operare, unde interpretorul de comenzi este
un program privilegiat (vezi [Link]), in Unix shell-ul este considerat ca fiind un
program obisnuit, neavind prioritate mai mare decat alte procese.

Shell-ul nu face parte din nucleul sistemului de operare. Exista mai multe interpretoare
disponibile, utilizatorul putand sa ceara incarcarea celul dorit de el. Se poate lansa chiar
un interpretor scris de utilizator, daca acesta e capabi de asa ceva... Cele mai cunoscute
interpretoare de comenzi sunt:sh(shell), csh (C-shell), ksh (KornShell),bash(Borne
Again Shell).

Toate comenzile au urmatoarea sintaxa:


$ comanda {argument1} {argument2}...{argumentn}
Comanda reprezinta o comanda interna (executata direct de shell) sau numele unui
program executabil, cautat in urmatoarea secventa:

• in directorul curent;
• in directorul /bin;
• in directorul /usr/bin;
• mesaj de eroare daca nu este gasit in locurile specificate mai sus

Celelalte campuriale comenzii definesc parametrii comenzii si se numesc argumente. Ele


sunt separate prin blank-uri. Se pot introduce mai multe comenzi pe aceeasi linie daca le
saparam prin ";"

Multe dintre argumentele unei comenzi sunt nume de fisiere, de aceea au fost introduse
niste metacaractere (caracterele jocker) pentru a ne putea referi la o multime de fisiere.
Metacaracterele sunt urmatoarele:

• * -orice sir de caracter (inclusiv sirul vid);


• ? -orice caracter;
• [...]-o multime de caractere;
• - -secventa lexicografica de caractere;

Exemple de folosire a metacaracterelor:


*.pas -toate fisierele sursa Pascal;
ex?.txt -toate fisierele text care au prefixul "ex "
ex[1-9] -indica fisierele ex1,ex2,...ex8;
prob[37]-indica fisierele prob3 si prob7;
pro[*?] -indica toate fisierele care incep cu "pro" si se continua cu un sir de caractere
oarecare, precum si fisierele cu numele format din 4 caractere, primele trei fiind "pro"
Redirectarea fisierelor

Dupa initializarea sesiunii de lucru, Shell deschide 3 fisiere standarad (0,1,2) pentru
intrare, iesire si afisarea [Link] sunt atribuite implicit tastaturii si, respectiv, ecanului.
In momentul in care interpretorul lanseaza programul asociat unei comenzi, acesta
mosteneste si fisierele deschise, deci si pe cele standard. Programele devin astfel
independente de dispozitivele fizice asociate de shell fisierelor [Link]
permite redirectarea fisierelor standard de intrare/iesire spre alte fisiere sau
[Link] exemplu, daca un program are ca iesire standard ecranul, putem trimite
datele (prin operatia de redirectare) catre un fisier text specificat.

• Cu ajutorul semnului "<" se redirecteza fisierul standard de intrare.


Acest lucru inseamna ca programul lansat de shell nu va mai lua datele de la
tastatura, ci dintr-un fisier indicat dupa operatorul "<".Spre exemplu:
prog
determina programul "prog" sa citeasca datele din fisierul "fis"
• Cu ajutorul operatorului ">" se redirecteaza iesirea [Link]
ls -l > fis
va lista continutul directorului curent in fisierul "fis". Daca fisierul exista deja,
prin folosirea operatorului ">>" in loc de ">" se va adauga informatia la sfarsitul
fisierului "fis"
• Un program poate fi lansat cu redirectarea simultana a intrarii si iesirii standard:
crypt '<'fis1> fis2,
comanda care cifreaza fisierul fis1 si depune rezultatul in fis2.

Comunicarea intre procese prin pipe

Comunicarea intre procese poate fi realizata prin redirectare(primul proces depune datele
intr-un fisier, de unde sunt citite de al doilea proces) sau prin tehnica pipe(conducta),
folosind operatorul ":".Comanda:
ls -l /bin | wc -l
determina numarul de fisiere aflate in directorul /bin (comanda ls listeaza continutul
directorului si transmite rezultatul comenzii wc, care numara cate linii are fisierul text
rezultat in prima faza).

4.2 Comenzi pentru gestiunea directoarelor

Pentru descrierea comenzilor se vor folosi urmatoarele semne:

• [identificator] - cimp optional;


• (identificator) - identificator de fisier sau director;
• identificator... - identificatorul se repeta de un numar nedefinit de ori;

1. pwd
o functia: tipareste numele (calea) directorului curent;
o sintaxa: pwd
o explicatii:comanda afiseaza calea completa, pornind din root, a
directorului in care lucreaza utilizatorul. Este folosita pentru a vedea unde
este plasat directorul curent in structura directoarelor sistemului.
2. cd
o functia:schimba directorul curent
o sintaxa: cd (director)
o explicatii:se abandoneaza directorul curent iar directorul specificat devine
director curent.
cd .. -directorul parinte devine director curent;
cd -directorul home, indicat ca director curent implicit in fisierul
/etc/passwd, devine director curent;
3. ls
o functia:listeaza continutul unui director;
o sintaxa:ls [optiuni] (fisier)...
o explicatii:Se afiseaza la terminal continutui oricarui director din lista si
,pentru fisiere, anumite informatii conform cu optiunile. Daca nu se
precizeaza nici un fisier, atunci se listeaza directorul curent.
Optiunile cele mai importante sunt:
 -d -listeaza doar numele directoarelor;
 -i -indica i-number-ul fiecarui fisier;
 -l -listeaza mai multe informatii despre fisiere;
 -g -se indica si identificatorul grupului proprietar al fisierului;
 -r -listare in ordine invers alfabetica;
 -s -dimensiunea fisierelor se da in numar de blocuri;
 -t -se sorteaza fisierele, inainte de afisare, dupa data ultimei
modificari;

Optiunea -l permite afisarea informatiilor complete despre fisiere, si


anume:

 cimpul mod:
 - pentru fisier ordinar;
 d pentru fisier director;
 c pentru fisier special de tip caracter;
 b pentru fisier special de tip bloc;
 drepturile proprietarului:read(r), write(w), execute(x);
 drepturile grupului:r,w,x;
 drepturile celorlalti:r,w,x;
 numarul de legaturi ale fisierului;
 numele proprietarului;
 numele grupului;
 dimensiunea fisierului (in bytes);
 data ultimei modificari;
 numele fisierului;
4. mkdir
o functia:creaza un director nou
o sintaxa:mkdir (director)
o explicatii:Creaza un nou director, cu numele specificat, pe care il leaga la
directorul [Link] setate automat si drepturile de acces.
5. rmdir
o functia:sterge un director
o sintaxa:rmdir (director)
o explicatii:Directorul specificat este sters doar daca este vid; daca
directorul nu este vid, este necesara stergerea prealabila a fisierelor
continute folosind comanda rm.

4.3 Comenzi pentru gestiunea fisierelor

1. cat
o functia:concateneaza fisiere text si afiseaza
o sintaxa:cat (fisier)
o explicatii:Comanda permite ca mai multe fisiere sa fie concatenate intr-un
singur sir de iesire, care va fi listat la terminal.
Exemple:
cat fis1
afiseaza fisierul fis1;
cat fis1 fis2 >newfile
concateneaza fisierele fis1 si fis2 si depune rezultatul in newfile;
comanda este echivalenta cu cat fis[12] >newfile
cat >fis
permite crearea unui fisier text de la tastatura, introducerea continutului
terminindu-se cu ^Z;
2. lpr
o functia:tipareste un fisier text la imprimanta
o sintaxa:lpr [optiuni] [(fisier)...]
o explicatii:--
3. wc
o functia:numara caracterele, cuvintele si liniile unui fisier text;
o sintaxa:wc [optiuni] [(fisier)...]
o explicatii:Optiunile sunt:
 -w pentru numararea cuvintelor;
 -c pentru numararea caracterelor;
 -l pentru numararea liniilor;
4. diff
o functia:gaseste diferentele dintre doua fisiere text
o sintaxa:diff [optiuni] (fis1) (fis2)
o explicatii:Cele doua fisiere sunt comparate linie cu linie, indicindu-se la
terminal ce trebuie facut pentru ca fisierele sa fie identice. Liniile
precedate de >= apar in fis2 si nu apar in fis1, iar cele prcedate de < apar
in fis1 si nu apar in fis2.
5. grep
o functia:filtreaza liniileunui fisier text cautand sabloane
o sintaxa:grep [optiuni] [sir de caractere] (fisier)
o explicatii:Utilizatorul citeste unul sau mai multe fisiere text cautand in
fiecare un anumit sir de caractere (sablon).Daca nu se specifica optiuni,
sunt afisate toate liniile care contin sablonul. Optiuni:
 -c -produce un contor al liniilor ce contin sablonul, in loc de a le
afisa;
 -v -caracterele mici din sablon vor fi identificate atat cu litere mici,
cat si cu litere mari in fisierul de intrare.
6. comm
o functia:gaseste si afiseaza toate liniile comune a doua fisiere text;
o sintaxa:comm [optiuni] (fis1) (fis2)
o explicatii:Cele doua fisiere vor trebui prealabi sortate alfabetic (functia
sort).
7. file
o functia:determina tipul unui fisier
o sintaxa:file (fisier)...
o explicatii:Comanda determina daca fisierele indicate sunt de tip obiect,
sursa sau oarecare. Pentru fisierele sursa incearca sa determine limbajul in
care au fost scrise.
8. find
o functia:gaseste un fisier intr-un subarbore al sistemului de fisiere
o sintaxa:find (director)...(conditie)
o explicatii:Se cauta in directoarele specificate si in subdirectoarele lor
fisierele care satisfac acea conditie. Conditiile se precizeaza prin optiuni:
 name (fisier) -specifica numele fisierului cautat;
 atime (n) -specifica toate fisierele accesate in ultimele n zile;
 mtime (n) -specifica toate fisierele modificate in ultimele (n) zile;
 print -calea curenta este afisata;
 type (i) -specifica tipup fisierului cautat:f-ordinar, d-director c-
special caracter, b-special bloc;
9. rm
o functia:sterge fisiere
o sintaxa:rm [optiuni] (fisier)...
o explicatii:Sterge fisierele indicate din directorul [Link] optiuni
permise sunt:
 -i -intreaba utilizatorul inainte de stergerea fiecarui fisier;
 -r -cere confirmarea de stergere inainte de stergerea fiecarui
subdirector;
 -f -sterge fisierul fara a analiza daca exista dreptul de scriere in
fisier;

Exemple:
rm -i * , sterge toate fisierele din directorul curent, cu confirmare
rm -r director, sterge tot subarborele ce are radacina in (director)

10. mv
o functia:muta/redenumeste un fisier
o sintaxa:mv (fis1) (fis2) sau
mv (fisier)...(director)
o explicatii:In prima forma va redenumi fis1, iar in a doua forma va muta
fisierele specificate in directorul (director)
11. cp
o functia:copiaza un fisier
o sintaxa:cp (fis1) (fis2) sau
cp (fisier)...(director)
o explicatii:Evident !
12. crypt
ofunctia:cifreaza un fisier
osintaxa:crypt [parola] [(fis1)] [(fis2)]
oexplicatii:Cifreaza fisierul (fis1), folosind drept cheie de cifrare [parola] si
depune rezultatul in (fis2). Daca nu se furnizeaza parola atunci este ceruta
explicit de program.
13. chown si chgrp
o functia:schimba proprietarul, respectiv grupul, la care este afiliat un fisier
o sintaxa:chown (nou proprietar) (fisier)
chgrp (nou grup) (fisier)
o explicatii:Evident !
14. chmod
o functia:schimba drepturile de acces pentru un fisier
o sintaxa:chmod (drepturi) (fisier)
o explicatii:Comanda poate fi utilizata doar de proprietarul fisierului,
precizarea drepturilor facandu-se sub forma: (cine) (op) (drept), unde:
 (cine) reprezinta:u-proprietar, g-grupul, o-ceilalti,a (toti)
 (drept)-r,w,x
 (op) operatorul aplicat: - (retrage drept), + (adauga drept),=
(asigneaza drept)

Exemple:
chmod a+r fis -acorda drepturi de citire tuturor utilizatorilor fisierului fis;
chmod go-rw fis -retrage drepturile de citire pentru grup si ceilalti;
chmod a=rwx fis -asigneaza tuturor drepturi complete asupra fisierului;
chmod a-w -retrage dreptul de a crea fisiere in directorul curent;

4.4 Comenzi pentru gestiunea proceselor

1. ps
o functia:afiseaza starea proceselor
o sintaxa:ps [optiuni] [(proces)]
o explicatii:Da informatii despre procesele active in acel moment, indicind
identificatorul procesului (PID),identificatorul parintelui(PPID) ,
terminalul de control al procesului (TT), starea procesului (STAT-
secventa de 5 litere, fiecare precizand un anumit aspect relativ la proces-
starea executiei, daca imaginea procesului se afla in memorie, prioritate),
durata procesului (TIME). Starea procesului poate fi:r-in executie, w-in
asteptare, s-suspendat, t-oprit, z-terminat, o-inexistent
Optiunile folosite cel mai des sunt:
 -a toate procesele asociate cu terminalul;
 -l listare informatii complete;
 -n toate procesele care nu sunt asociate cu terminalul;
2. nice
o functia:incarca un proces (task) cu prioritate redusa
o sintaxa:nice [-(prioritate)] comanda [argumente]
o explicatii:Lanseaza un task in paralel, avand prioritate mica. Prioritatea
este un numar, numerele mari insemnind prioritate redusa. Administratorul
poate lansa procese cu prioritate ridicata, chiar negativa. Prioritatile date
prin nice trebuie sa fie pana la 20. Daca prioritatea nu este specificata, se
incrementeaza cu 10 prioritatea implicita data de sistem.
Procesele executate cu nice, sunt executate in fundal (background),
eventual dupa terminarea sesiunii de lucru, fiind procese cu timp mare de
executie (de exemplu, efectuarea unui download).
Comanda nice 19 prog & lanseaza in fundal (prin operatorul &) prog, cu
prioritatea [Link] aceluiasi program dupa terminarea sesiunii de
lucru se face cu comanda:
nice nohup prog & , comanda nohup permitand acest lucru.
3. kill
o functia:"omoara" un proces in curs de executie
o sintaxa:kill [optiuni] (pid)
o explicatii:Distruge procesul cu identificatorul (pid). Semnalul de
distrugere sigura se da prin folosirea optiunii -9, altfel nefiind sigur ca
distrugerea se va realiza. Optiunea -9 se va folosi doar cand prima forma a
comenzii nu da rezultate.
4. sleep
o functia:suspenda temporar executia unui proces
o sintaxa:sleep (timp)
o explicatii:Timpul este dat in secunde
5. time
o functia:furnizeaza timpul de executi al unei comenzi
o sintaxa:time (comanda)
o explicatii:Se lanseaza in executie (comanda), iar la sfirsitul executiei se
afiseaza timpul de executie si timpul sistem, in secunde.
6. sh
o functia: lanseaza in executie interpretorul Shell
o sintaxa: sh (fisier)
o explicatii:Executa un fisier de comenzi Shell.

Comenzi informative si pentru terminale

1. man
o functia:afiseaza capitole din manualul de utilizare
o sintaxa:man [optiuni] [(capitol)] (sectiune)
o explicatii:Permite afisarea manualului sistemului Unix in timpul sesiunii
de lucru. (capitol) este numarul capitolului in care se cauta (sectiune). Se
foloseste cel mai des sub forma man (comanda) pentru afisarea
informatiilor despre comanda specificata.
2. cal
o functia:afiseaza calendarul
o sintaxa:cal [luna] an
o explicatii:Clar !
3. date
o functia: afiseaza data si ora
o sintaxa:date
o explicatii:Clar !
4. finger
functia:afiseaza numele utilizatorilor conectati la sistem
o
sintaxa:finger [(nume)]
o
explicatii:Daca se specifica numele unui utilizator, se dau informatii
o
despre acesta.
5. passwd
o functia:schimba parola
o sintaxa:passwd
o explicatii:Vom reveni !
6. tty
o functia: afiseaza numele terminalului
o sintaxa: tty
o explicatii:Clar !
7. write
o functia: trimite imediat un mesaj la un alt utilizator
o sintaxa:write (utilizator)
o explicatii:Dupa scrierea comenzii se scrie mesajul, incheiat cu ^Z.

Fisiere de comenzi Unix

• 5.1 Generalitati despre programarea shell


• 5.2 Afisarea datelor. Comentarii
• 5.3 Variabile
• 5.4 Citirea datelor. Comanda read
• 5.5 Verificarea unei conditii. Comanda test
• 5.6 Instructiunea if
• 5.7 Instructiunea case
• 5.8 Instructiunea for
• 5.9 Instructiunea while
• 5.10 Instructiunea until
• 5.11 Crearea meniurilor simple. Instructiunea select
• 5.12 Alte comenzi si chestii interesante
• 5.13 Exemple de scripturi

5.1 Generalitati despre programarea shell

Interpretorul de comenzi al sistemului de operare Unix furnizeaza, pe langa posibilitatea


de executare a comenzilor, un set de instructiuni care permite scrierea de programe
asemanatoare celor scrise in limbaje de programare de nivel inalt. Fireste, posibilitatile
acestui limbaj sunt mult mai slabe decat cele ale unui limbaj ca C ori Pascal, dar exista
aplicatii in care efortul de programare este mult redus. Pe linga comenzile "obisnuite",
care apar in orice sistem de operare, Unix furnizeaza si o multime de utilitare, mai ales
pentru fisiere text. Limbajul Shell este puternic si eficient pentru:

• Aplicatii a caror rezolvare implica mai multe operatii realizabile prin comenzi
Shell;
• Aplicatii care manipuleaza date sub forma fisierelor text sau a liniilor de text;
• Aplicatii care cer consultarea directoarelor si parcurgerea sistemului de fisiere;

Nu in ultimul rand, atunci cand facem operatii periodice care implica folosirea
comenzilor Shell, putem sa ne automatizam munca prin crearea unui fisier de comenzi.
Vom numi fisier de comenzi orice secventa de comenzi memorata intr-un fisier disc.
Prin program Shell sau script vom intelege un fisier ce contine, pe linga comenzi,
structuri de control al executiei (instructiuni repetitive si de decizie) si variabile. Acest
capitol prezinta cele mai importante concepte in programarea scripturilor sub Bourne
Again Shell (BASH) , cel mai raspindit in sistemul Linux. Pentru a programa sub alt shell,
trebuie consultate documentatiile corespunzatoare, pentru a vedea care sunt diferentele.

Obiectele ce compun un script sunt:

• Comenzi Linux;
• Variabile:
1. Variabile definite de utilizator;
2. Variabile predefinite (sistem);
3. Variabile speciale;
• Instructiuni de citire/scriere:
1. read pentru citirea datelor;
2. echo pentru afisarea datelor si mesajelor;
• Instructiuni de decizie:
1. if -instructiune de decizie simpla;
2. case-instructiunea de decizie multipla;
3. select-instructiune pentru crearea de meniuri simple;
• Instructiuni iterative:
1. for
2. while
3. until
• Instructiuni de salt:
1. break-iesire fortata dintr-un ciclu
2. continue-forteaza continuarea unui ciclu pentru urmatoarea valoare a
contorului

Dupa cum ati observat, nu exista o instructiune de salt neconditionat (goto), programele
capatand astfel lizibilitate. Introducerea instructiunilor repetitive permite scrierea de
programe structurate, spre deosebire de "limbajul" batch din sistemul de operare
MSDOS.

Un script poate primi in linia de comanda argumente. De asemenea, se pot apela, din
interiorul unui script, alte scripturi.

Scripturile pot fi scrise cu ajutorul unui editor de texte ca vi, ed, emacs. Apoi se
stabileste dreptul de executie a fisierului, numele sau putand fi folosit ca o comanda
obisnuita. Shell-ul va executa fisierul comanda cu comanda.
Un exemplu de fisier de comenzi simplu este urmatorul:

pwd
ls -l
finger

EXERCITIU: Ce efect are executarea acestui fisier de comenzi ?

5.2 Afisarea datelor. Comentarii

Introducerea de comentarii

De cele mai multe ori, la inceputul programului, trebuie sa precizam care este efectul
acestuia, pentru ca nu este intotdeauna evident acest lucru (s-ar putea ca pe unii utilizatori
sa nu-i intereseze cum lucreaza scriptul ci doar ce face acesta). La inceputul programului
trebuie precizat sub ce interpretor a fost scris. De exemplu, comanda speciala #!/bin/sh
indica faptul ca instructiunile care urmeaza trebuie interpretate de Bourne Shell.
O linie de comentariu incepe intotdeauna cu semnul # si nu este interpretata de shell.

Proceduri de citire/scriere

Afisarea informatiilor se face cu ajutorul comenzii echo a carei sintaxa este:


echo [optiuni] [parametri]
Comada echo trimite parametrii pe canalul de iesire standard. Principalele caractere
speciale ale comenzii sunt:
Caracter special Efect
Pentru a se tine cont de caracterele
\a Alarma sonora speciale ce apar in sirurile de
caractere date ca argumente, trebuie
\n Salt la linie noua folosita optiunea -e, de exemplu:
echo -e "Luni\nMarti", afiseaza:
\b Intoarcere
Luni
\t Marcheaza un paragraf (TAB) Marti

\\ Afisarea unui backslash

Afisarea valorii unei variabile se realizeaza prin folosirea caracterului $ inaintea numelui
variabilei.
echo $s, afiseaza valoarea variabilei s.

5.3 Variabile

Variabile definite de utilizator

Numele variabilelor definite de utilizator trebuie sa respecte urmatoarele reguli:

• Un nume de variabila poate contine litere mari si mici, cifre si caracterul "_";
• Un identificator nu poate incepe cu o cifra (evitati folosirea ca prim caracter a
caracterului "_");
• Lungimea identificatorului nu este, teoretic, limitata;
• Prin conventie, variabilele definite de utilizator se scriu cu litere mici;

Declararea unei variabile se face implicit prin atribuirea unei valori (ca in BASIC).

x=Miercuri este o operatie de atribuire, in urma careia variabila x este declarata ca


variabila sir de caractere si primeste valoarea "Miercuri". Nu lasati spatii inainte sau dupa
semnul "=" !
O variabila poate contine caractere speciale sau spatiiin textul dat ca valoare, caz in care
se folosesc ghilimelele:

Comenzile:
s="Azi e luni si\nincepe semestrul"
echo -e $s

afiseaza:

azi e luni si
incepe semestrul
Exista posibilitatea de a proteja o variabila la eventuale modificari accidentale, folosind
comanda readonly (variabila). Dupa aceasta comanda, incercarea de a modifica valoarea
variabilei determina aparitia unui mesaj de eroare.

In cazul in care nu mai stim numele tuturor variabilelor folosite, putem obtine lista
variabilelor, inclusiv valoarea actuala, prin comanda set. Aceasta lista contine nu numai
variabilele definite de utilizator ci si variabilele sistem.
Variabilele pot fi exportate in alte shell-uri, prin comanda export (var).... Un script ce
contine comenzile #!/bin/sh si export a b c, va exporta variabilele a,b,c in Bourne Shell.
Shell-ul care importa variabile poate sa le modifice valoarea, dar modificarile nu sunt
transmise si in shell-ul care le-a exportat.
Exemplu:

Presupunem ca s-au definit variabilele:


a="Decat mult si fara rost"
b="putin"
c="prost"
si s-a creat urmatorul script, in fisierul deviza:

#!/bin/sh
echo -e "$a mai bine $b si $c !\n"
a="Ce mai faci ?\n"
echo -e $a

Daca se dau comenzile:

hasdeu~$ export a b c
hasdeu~$ deviza
hasdeu~$ echo $a

se va afisa :

Decat mult si fara rost mai bine putin si prost !


Ce mai faci ?
Decat mult si fara rost

Putem defini explicit variabile de tipul intreg prin comanda declare -i (var), incecarile
ulterioare de a da variabilei o valoare sir de caractere determinand obtinerea valorii 0
pentru acea variabila.
Operatorii disponibili sunt:

• +, -, *, / -adunare, scadere, inmultire, impartire


• % -modulo aritmetic
• <, >, <=, >= -operatori relationali
• == si != pentru egal, respectiv diferit
• && si || pentru si, respectiv sau logic
• &, |, ^ -comparare bit cu bit (si, sau, respectiv sau exclusiv)
Exemplu:
declare -i n1
declare -i n2
n1=8
n2=6
n1=n1+n2 #sau let n1=n1+n2
n2=n2%2
echo $n1 $n2

Se poate folosi comanda let pentru a realiza mai rapid operatiile.

Variabile sistem

Foarte multe utilitare lucreaza cu variabile a caror valoare este predefinita si care sunt la
dispozitia tuturor utilizatorilor (le vom numi variabile sistem). De obicei, variabilele
sistem sunt scrise cu litere mari, pentru a le deosebi de variabilele definite de utilizator.
Modificarea valorii unei variabile sistem poate crea neplaceri, deoarece utilitarele care
folosesc valoarea variabilei vor lucra defectuos !!!
Dintre variabilele sistem prezentam urmatoarele:

VARIABILE SEMNIFICATIE
HOME Contine calea de acces absolut spre directorul personal
Contine caile in care shell cauta programele, de regula
PATH
/usr/bin si /bin
PS1 Defineste prompterul asociat interpretorului, implicit $
Defineste al doilea prompter, implicit >, atunci cand
PS2
o comanda se continua pe alta linie
De exemplu,
Variabila utilizata de comanda select, pentru a pentru a
PS3 specifica un prompter care sa apara inaintea fiecarei schimba
intrari in meniul creat de utilizator prompterul
implicit, se
OLDPWD Conserva calea de acces in directorul precedent foloseste
variabila PS1,
PWD Memoreaza calea catre directorul curent
careia ii dam
Contine, la fiecare acces, un numar aleator intre valoarea
RANDOM PS1="da
0 si 32767
comanda, omule
$"
Variabile speciale (predefinite)

O categorie aparte de variabile sistem sunt cele predefinite, numite si variabile speciale.
Ele sunt variabile readonly, initializate si actualizate doar de interpretor. Variabilele
speciale sunt date in urmatorul tabel:

VARIABILE SEMNIFICATIE
$? Contine codul de revenire a ultimei comenzi executate
$$ Identificatorul de proces al shell-ului activ
$! Identificatorul (pid) ultimului proces lansat in paralel
$# numarul de argumente pozitionale pentru shell

Valori returnate

Este foarte important a se putea determina daca o comanda a fost executata cu succes sau
nu. Fiecare comanda returneaza o valoare (exit status) memorata in variabila $?. Daca
valoarea este 0 inseamna ca a aparut o eroare in cursul executiei ultimei comenzi si este
nenula in caz contrar. Testul executiei cu succes se poate face cu ajutorul comenzii test,
ce va fi prezentata ulterior.

Parametri de pozitie

Pentru a putea furniza si argumente in linia de comanda a unui script, se folosesc


parametri de pozitie, prin care sunt disponibile valorile acestora. Parametri de pozitie sunt
notati cu $1, $2,..., $9. $0 contine numele scriptului, $1 contine primul parametru, $2
contine al doilea parametru e.t.c
Variabila speciala $# va contine numarul parametrilor de pe linia de comanda, fiind utila
pentru testarea existentei tuturor argumentelor necesare scriptului respectiv. Exista
posibilitatea folosirii a mai mult de noua parametri in linia de comanda, insa nu vom
detalia aici acest lucru (nici nu cred ca veti avea nevoie de aceasta facilitate).

5.4 Citirea datelor. Comanda read

Pentru a avea un contact direct cu utilizatorul, in afara folosirii parametrilor de pozitie,


exista pozibilitatea de a se introduce date prin intermediul comenzii [Link] citite
sunt transmise pe canalul de intrare standard si memorate in variabilele pasate ca
parametrii din comanda read. Sintaxa este urmatoarea:

read (variabila)...
La intalnirea unei comenzi read, shell-ul asteapta introducerea datelor si validarea lor prin
apasarea tastei ENTER. Shell-ul imparte linia de intrare in cuvinte, afectand primul
cuvant primei variabile, al doilea celei de-a doua variabile...Ultimele cuvinte sunt
memorate in ultima variabila. Este de dorit ca orice comanda read sa fie precedata de un
echo, pentru a explica utilizatorului ce dorim sa introduca.

5.5 Verificarea unei conditii. Comanda test

Comanda test verifica indeplinirea unei conditii si intoarce o valoare care sa marcheze
acest lucru. Pentru a se cunoaste rezultatul testului, se foloseste variabila $?. Aceasta are
valoarea 0 daca testul este pozitiv (conditie adevarata) si o valoare diferita de 0 in caz
contrar.
Comanda test realizeaza urmatoarele teste:

• teste asupra fisierelor


• teste asupra sirurilor de caractere
• teste numerice

Teste asupra fisierelor

Testul asupra unui fisier consta in verificarea daca acesta verifica o conditie specificata
printr-o optiune. Sintaxa generala este urmatoarea:

test -optiune (fisier sau director)


Conditiile posibile sunt:

OPTIUNE SEMNIFICATIE
Comanda test poate fi combinata
-e Fisierul exista (indiferent de tipul sau) cu alte comenzi cu ajutorul
operatorilor && si ||, formindu-se
-f Fisier normal ? siruri de comenzi. Cea mai
folosita combinatie este cea cu
-d Fisier director ? comanda echo:
-c Fisier special (periferic) de tip caracter ?
test -x doom && echo "Aveti
-b Fisier special de tip bloc ? drept de executie !!!"
stabileste daca exista drept de
-p Fisier pipe ? executie asupra fisierului doom
si, in caz afirmativ, afiseaza un
-r Drept de acces pentru citire ?
mesaj.
-w Drept de acces la scriere ?
-x Drept de executie ?
-s Fisier nevid ?
Teste asupra sirurilor de caractere

Exista doua tipuri de teste asupra sirurilor de caractere: test pentru a controla daca un sir
de caractere este vid si test pentru a vedea daca doua siruri sunt identice. Pentru primul
tip de test avem doua optiuni:

test -z "variabila" (testeaza daca variabila contine un sir vid)


test -n "variabila" (testeaza daca variabila contine un sir
nevid)

Variabilele se scriu intre ghilimele pentru a ne asigura ca nu vor aparea erori de sintaxa
din cauza sirurilor vide.

A doua forma ne permite sa verificam daca doua siruri sunt sau nu identice, de exemplu:

test "$a" = impozit


verifica daca variabila $a are ca valoare sirul impozit.
test "$f" != exit
verifica daca variabila $f nu are valoarea exit

Aici nu este obligatorie folosirea ghilimelelor pentru sirurile de caractere.

Teste numerice

Pentru testele numerice, comanda test trebuie sa aiba trei parametri:


test (valoare1) -optiune (valoare2) , unde valoare1 si valoare2 sunt termenii care se
compara, iar optiunea specifica relatia de ordine folosita.

OPTIUNE SEMNIFICATIE
Exemplu:
-eq Egal
x=10
-ne Diferit y=6
test "$x" -ge "$y" && echo "$x
mai mare ca $y"
-lt Mai mic (less than)
Scriptul verifica daca valoarea
-gt Mai mare (greater than) variabilei x este mai mare sau egala cu
valoarea lui y si
-le Mai mic sau egal afiseaza mesajul corespunzator.

-ge Mai mare sau egal


Daca unul dintre termeni nu este definit (variabila
neinitializata), atunci comanda test nu va functiona.

Exista posibilitatea de a combina mai multe teste prin folosirea unor optiuni de
combonare "logica":
OPTIUNE SEMNIFICATIE
Exemple:
! Negatia logica 1) test ! -s "$f"
returneaza valoarea 0 daca fisierul cu
-a Combinatie de teste prin SI logic numele continut de variabila $f este
vid.
-o Combinatie de teste prin SAU logic 2) test -d "$f" -a -x "$f" returneaza 0
daca fisierul $f este un director si
avem drept de executie.
3) test -c "$1" -o -b "$1" && echo "Fisier asociat unui periferic"
returneaza 0 daca primul argument al liniei de comanda este un fisier special de tip
caracter sau bloc; in acest caz se afiseaza si mesajul corespunzator.

Este posibila folosirea parantezelor pentru a crea expresii complexe. Pentru a putea folosi
parantezele, acestea vor fi precedate de caracterul \, ca in exemplul de mai jos:
test \( -e "$1" \) -a \(-f "$1" -o -d "$1" \)
Exercitiu: Ce semnificatie are aceasta comanda ?

Forma restrinsa a comenzii test

Pentru a putea fi folosita mai usor in combinatie cu instructiunea if, comanda test are si o
forma simplificata, in care numele comenzii este inlocuit de parantezele patrate [ si ]:

[ -r lista ]
este echivalenta cu
test -r lista

Efectul executiei formei simplificate este acelasi !

5.6 Instructiunea if

Marele avantaj al limbajului de programare shell consta in existenta structurilor de


control al executiei instructiunilor. Instructiunea if permite conditionarea executiei unei
comenzi de indeplinirea unei conditii logice.
Sintaxa instructiunii este urmatoarea:

if (expresie logica)
then
(comanda)...
[else
(comanda)... ]
fi

unde:
(expresie logica)- comanda sau suita de comenzi cu
rezultat logic
(comanda) - orice comanda acceptata de shell,
inclusiv if
Instructiunea if functioneaza la fel ca instructiunile similare din limbajele Pascal si C.
Cuvintele if, then, else si fi sunt cuvinte cheie. Este obligatoriu ca instructiunea if sa fie
scrisa asa cum apare mai sus.

EXEMPLE: 1. Scriptul urmator:

if grep "Georgescu" lista > /dev/null


then
echo "Numele a fost gasit in lista "
else
echo "Numele nu este in lista "
fi
cauta numele Georgescu in fisierul lista si afiseaza un mesaj in care se precizeaza
rezultatul cautarii. Dupa cum stiti (oare ?), comanda grep fara optiuni afiseaza liniile care
contin sablonul specificat. Prin redirectarea iesirii (>/dev/null), se trimit liniile de text
catre perifericul null (trimitere catre "nicaieri"), pentru ca nu ne intereseaza liniile gasite,
ci doar daca exista asemenea linii.
2. In exemplul urmator vom rescrie scriptul precedent, sablonul si fisierul in care cautam
fiind date ca argumente pe linia de comanda:
if grep "$1" "$2" >/dev/null
then
echo "$1 apare in fisierul $2"
else
echo "$1 nu apare in fisierul $2"
fi

3. Rescriem scriptul precedent, testand corectitudinea liniei de comanda (se verifica daca
numarul argumentelor din linia de comanda este corect).
if [$# -lt 2]
then
echo "Prea putini parametri. Corect este: $0 sablon fisier"
exit 1
fi
if grep "$1" "$2" >/dev/null 2>&1
then
echo "$1 apare in fisierul $2"
else
echo "$1 nu apare in fisierul $2"
fi
exit 0

OBSERVATII:
Pentru testarea numarului de parametri s-a folosit variabila speciala $#, care memoreaza
numarul de argumente din linia de comanda a ultimei comenzi. S-a folosit comanda test
in forma simplificata.
Comanda exit este folosita pentru terminarea fortata a executiei scriptului, un parametru
nenul al acesteia indicand ca scriptul s-a terminat cu eroare. Daca numarul argumentelor
este corect, scriptul va returna la terminare valoarea 0 (exit 0).
Am folosit expresia 2>&1 pentru a uni canalul de iesire si canalul de eroare standard.
Acest lucru este necesar pentru ca, in cazul aparitiei unei erori, mesajul de eroare sa nu
fie trimis pe canalul de eroare standard (ar aparea pe ecran si nu dorim acest lucru) ci pe
canalul de iesire (iesirea a fost redirectata spre perifericul nul).

5.7 Instructiunea case

Pentru deciziile multiple a fost implementata instructiunea case, care are urmatoarea
sintaxa:

case (valoare) in
(sablon_1) (comanda)...;;
(sablon_2) (comanda)...;;
...
esac

unde:
(valoare) -"variabila" de selectie
(sablon_i)-criteriu de cautare (domeniu de valori)
(comanda) -orice comanda sau succesiune de comenzi
acceptate de shell

FUNCTIONARE:
Daca (valoare) se incadreaza intr-unul din domeniile specificate, se executa lista de
comenzi corespunzatoare domeniului respectiv. Sunt permise folosirea caracterelor
speciale in compunerea sabloanelor.
EXEMPLU:
Urmatorul script:

case $LOGNAME in
root) PS1="#";;
lucian | danut) PS1="Buna prietene $LOGNAME $";;
*) PS1="Buna user obisnuit \h:\w\$ ";;
esac
export PS1
readonly PS1

poate fi introdus in fisierul /etc/profile pentru a stabili forma prompterului pentru fiecare
categorie de utilizatori. $LOGNAME contine numele ultimului utilizator care s-a
conectat la sistem. Utilizatorii lucian si danut au un prompter diferit de cel al utilizatorilor
obisnuiti (sunt, probabil, prieteni cu root-ul...).
EXERCITIU:Rescrieti scriptul de la instructiunea if, verificand parametrii din linia de
comanda cu instructiunea case.

5.8 Instructiunea for

Instructiunea for se foloseste atunci cand un grup de comenzi trebuie executat de mai
multe ori. Spre deosebire de instructiunea for din alte limbaje, in limbajul shell nu se
fixeaza o limita inferioara si una superioara pentru variabila contor, aceasta luand valori
dintr-o lista explicita de valori sau potivit unui anumit criteriu de cautare (in FOXPRO se
intalneste o astfel de forma a instructiunii for). Sintaxa este:
for (variabila) in (lista)
do
(comanda)...
done

Folosirea listelor explicite de valori

O lista explicita este specificata prin enumerarea valorilor sale. Variabila contor va lua ca
valoare, pe rand, fiecare valoare din lista:

for fis in lista1 lista2 lista3


do
cat $fis
rm -i $fis
done

Variabila $fis ia, pe rand, valorile lista1, lista2, lista3, reprezentand nume de fisiere,
afiseaza continutul fiecaruia, dupa care le sterge (cu confirmarea stergerii).

Liste construite dupa un anumit criteriu

Listele pot fi construite cu ajutorul simbolurilor folosite pentru scrierea numelor de fisier,
referindu-ne la o multime de fisiere ce respecta un anumit criteriu. In exemplul urmator
se vor afisa toate fisierele ce contin un text sursa C:

for fis in *.c


do
cat $fis
done

Liste de valori implicite

Lista de valori implicite este formata din lista parametrilor de pozitie, care este memorata
variabila speciala $@.

for fis in $@
do
lpr $fis
done

care este echivalent cu:

for fis
do
lpr $fis
done
5.9 Instructiunea while

Ciclul while este folosit pentru executia unei liste de comenzi atat timp cat este adevarata
o anumita conditie. Sintaxa este urmatoarea:

while (expresie logica)


do
(comanda)...
done

De cele mai multe ori, se foloseste comanda test drept expresie logica in instructiunea
while.
EXEMPLE:
1. Pentru validarea corectitudinii datelor de intrare vom scrie urmatoarea secventa de
instructiuni:
echo -e "Introduceti numele fisierului: \c"
read fis
while [-z "$fis"]
do
echo "Eroare de introducere"
echo -e "Introduceti numele fisierului: \c"
read fis
done

Se poate folosi un ciclu while cu executie infinita datorita comenzii true, care returneaza
intotdeauna valoarea zero:
while true
do
...
done

In acest caz, se vor folosi instructiuni de iesire fortata din ciclu ca break si exit.

5.10 Instructiunea until

Ciclul until se termina atunci cand conditia devine adevarata. Sintaxa este:

until (expresie logica)


do
(comanda)...
done

Se poate folosi comanda false pentru a obtine o bucla until infinita.

5.11 Crearea meniurilor simple. Instructiunea select

Sintaxa instructiunii select este:


select (variabila) in (lista de valori)
do
(comanda)...
done

Lista de valori este afisata pe ecran prin canalul de eroare standard. Fiecare optiune,
precizata in lista de valori, este precedata de un numar de ordine. Instructiunea se termina
prin apasarea combinatiei ctrl+D.
EXEMPLU:
Scriptul (sa presupunem, ca are numele exemplu):
PS3="Introduceti un numar intre 1 si 3: "
select optiune in matematica fizica informatica
do
if [ -n "$optiune" ]
then
echo "Materia preferata este $optiune"
fi
done

are urmatorul efect:

hasdeu:~$ exemplu
1) matematica
2) fizica
3) informatica
Introduceti un numar intre 1 si 3: 3
Materia preferata este informatica
1) matematica
2) fizica
3) informatica
Introduceti un numar intre 1 si 3: ctrl+D
hasdeu~$

Daca se omite lista de valori, se lucreaza implicit cu parametrii de pozitie, la fel ca in


cazul instructiunii for.

5.12 Alte comenzi si chestii interesante

Substitutia unei comenzi

Shell-ul ne ofera posibilitatea de a substitui numele comenzilor cu numele dorite de


utilizator. Sintaxa este urmatoarea:

sir=$(suita de comenzi)

Spre exemplu, pentru a substitui comanda pwd, scriem:


unde_sunt=$(pwd)

In continuare, scriind sirul unde_sunt se va executa de fapt comanda pwd.


Definirea functiilor

Definirea unei functii se poate face din linia de comanda, scriind numele functiei si
parantezele (). La intalnirea parantezelor, shell-ul asteapta introducerea acoladei deschise
si a corpului functiei, iar in final acolada inchisa (semnificand terminarea definirii
functiei). Sa definim o functie pentru listarea directoarelor date ca argumente, in forma
lunga:

hasdeu~$ listez ()
{
/bin/ls -l $@ | more
}

Pentru a se afisa declaratia functiei se foloseste comanda declare -f . Definitia unei


functii nu este disponibila, ca si in cazul variabilelor, decat in shell-ul in care au fost
definite. Pentru a putea exporta o functie in alt shell, se foloseste aceeasi comanda, insa
cu parametrul -fx, urmat de numele functiei exportate.
Pentru ca functia sa ramana disponibila si dupa ce shell-ul in care a fost definita isi
incheie executia, putem scrie functia in fisierul .profile (un fel de [Link]), fiind
astfel recunoscuta la fiecare conectare.
Cea mai buna solutie este aceea a scrierii functiei intr-un fisier de tip "mai special",
numit, sa zicem, [Link]. Comanda . [Link] va face "vizibile" functiile din acest
fisier in shell-ul activ.
EXEMPLU:
listez ()
{
/bin/ls -l $@ | more
}
sterg ()
{
for i
do
echo -n "Stergeti fisierul $i (d/n)?"
read opt
case opt in
[dDnN]*) /bin/rm $i;;
esac
done
}

Exercitiu : Ce efect are executia functiei sterg ?


Pentru crearea scripturilor complexe, se pot folosi functii definite la inceputul scriptului,
functiile jucand rolul de subprogram.
Nu este indicata folosirea comenzii exit in corpul unei functii pentru ca va putea avea
efectul deconectarii utilizatorului din sistem. Cand este necesara terminarea unei functii
se va folosi comanda return.
5.13 Exemple de scripturi

1. Scrieti un script care sa primeasca drept argument un nume de utilizator si sa afiseze


daca acesta este conectat in sistem si cate sesiuni are deschise.

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