Sunteți pe pagina 1din 96

UNIX-notiuni de baza Caracteristicile sistemului Unix Sistemul UNIX este un sistem de operare cu destinatie generala, multiutilizator, multiproces, lucrind

in regim time-sharring. Caracteristici: 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. Unix este un sistem multiutilizator, permitind lucrul simultan de 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). 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 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. 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 programme Basic, .c pentru programe C, e.t.c Dirctoarele sunt fisiere care contin informatii 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. 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 (inumber) 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 inod 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 deschise 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 inoduri 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 inoduri 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. Structura arborescenta a directoarelor Directorul este un fisier care contine, pentru fiecare fisier, numele extern al fisierului si inumberul 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 contine fisierele cu

numele . si .. care identifica i-nodul propriu al directorului, respectiv i-nodul directorului parinte. Structura generala a arborelui cataloagelor (simplificata) este urmatoarea:

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: bin -utilitare mai rar folosite man&doc -manuale si documentatie spool -fisiere pentru imprimanta si posta electronica 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 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. Notiunea de proces Unix. Incarcarea sistemului de operare Sistemul de operare Unix are drept concept fundamental conceptul de proces. Procesul poate fi definit, in prima instanta, ca fiind un program in executie. 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 - 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 scheduler pentru sistemele cu paginare si swapper pentru sistemele cu evacuare. 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); Start\Run\telnet. Enter

Cont pentru conectare stud1..6 parola stud16

Sau conectare prin putty: Cont pentru conectare stud1..6 parola stud

Sau conectare prin Secure Shell Client

Interpretoare de comenzi. Comenzi Shell. Multe sisteme de operare poseda o componenta specializata numita interpretor de comenzi. Aceasta componenta este responsabila cu asigurarea dialogului elementar intre

utilizator si sistemul de operare. In linii mari, interpretorul de comenzi functioneaza astfel : afiseaza un mesaj de invitatie (prompter); forma acestuia difera de la un sistem la altul, putand fi un simplu caracter ($,%,#) sau o succesiune de caractere. Prompter-ul indica faptul ca sistemul este gata sa primeasca comenzi; preia o linie de comanda de la utilizator; descompune linia de comanda intr-un nume de comanda si o serie de argumente; daca numele de comanda identifica o comanda interna, atunci interpretorul de comenzi executa el insusi comanda respectiva; in caz contrar, numele comenzii este utilizat pentru a repera un fisier executabil care este incarcat si executat; dupa terminarea executiei comenzii curente, afiseaza din nou prompter-ul, asteptand o noua comanda. Dialogul cu un sistem UNIX are loc, de obicei, prin intermediul unui terminal. Dupa initializarea sesiunii de lucru a unui utilizator (introducerea numelui de login si, eventual, a parolei) se lanseaza interpretorul de comenzi (shell). In cazul UNIX-ului, interpretorul de comenzi este un program obisnuit, cu nimic mai privilegiat ca altele. Utilizatorul are posibilitatea sa aleaga el ce program sa fie lansat la inceputul sesiunii. Pe sistemul UNIX, interpretoarele de comenzi cele mai folosite sunt : sh (Bourne shell), csh (C shell), ksh (Korn shell).

In termenii utilizati de UNIX, fiecare program in executie este un proces. Comanda $ date folosita pentru a afla ora si data curente, declanseaza urmatoarea secventa de actiuni : interpretorul de comenzi citeste comanda si o analizeaza; interpretorul de comenzi lanseaza procesul date, intrand totodata in asteptarea terminarii acestuia (se spune ca el adoarme pe durata executiei comenzii); procesul date afiseaza informatia referitoare la data curenta; la terminarea procesului date, interpretorul de comenzi preia controlul si afiseaza din nou prompter-ul, asteptand o noua comanda. La un moment dat, mai multe procese pot fi incepute si neterminate; spunem ca ele sunt active. De ex., la executia comenzii date, sunt active interpretorul de comenzi si procesul date insusi. Obs.: Daca cele doua procese sunt active, nu inseamna ca ele se executa simultan, ci doar ca executia ambelor a inceput si nu s-a terminat. In exemplul precedent, in timp ce se executa procesul date, interpretorul de comenzi asteapta terminarea lui. Obs.: Oprirea unui program inainte de terminarea executiei sale se realizeaza cu CTRL+C. Utilizarea lui provoaca terminarea fortata a programului si reluarea controlului de catre interpretorul de comenzi. Alte caractere de control sub UNIX: Ctrl-s oprete afiarea textului pe ecran Ctrl-q reia afiarea textului pe ecran (oprit cu Ctrl-s) Ctrl-c ntrerupe activitatea curent i se folosete de regul pentru a opri procese sau afiri pe ecran. Ctrl-d semnific sfritul fiierului sau ieire, fiind utilizat pentru a iei din unele utilitare Unix, ieirea unei ferestre terminal sau pentru logout. Ctrl-u terge ntreaga linie de comand, fiind o modalitate rapid de a terge o linie de comand pe care ne-am decis s nu o mai executm. Ctrl-w terge ultimul cuvnt introdus la linia de comand Ctrl-h terge ultimul caracter introdus la linia de comand, fiind folosit atunci cnd tasta <BACKSPACE> nu funcioneaz Gruparea comenzilor Pot fi introduse mai multe comenzi pe aceeasi linie, separate prin ';'. De ex.: $ pwd ; ls l va afisa mai intai numele directorului curent ( pwd) si apoi ii va afisa continutul (ls); procesele se executa secvential. De asemenea, se pot grupa comenzi in forma : cmd1 | cmd2 | ... |cmdn unde comenzile cmd1 , cmd2 ,..., cmdn sunt executate in paralel, iesirea standard a fiecarei comenzi (cu exceptia ultimei) fiind legata printr-o conducta cu intrarea standard a comenzii urmatoare. Ex.: vrem sa determinam cate fisiere contine directorul /bin. Pentru aceasta vom folosi comenzile ls - listare director si wc - numara linii: $ ls -l /bin | wc -l Gruparea comenzilor sub forma : (lista comenzi) determina executia acestora ca un proces separat. Ex.: $ pwd ; (cd ../test ; pwd) ; pwd /users/u1/demo

/users/u1/test /users/u1/demo Efectul comenzii cd din lista de comenzi inchisa intre paranteze este anulat la intalnirea parantezei inchise, deoarece cd a schimbat catalogul curent numai pentru subprocesul lansat pentru executarea acelei liste de comenzi. Gruparea comenzilor sub forma : {lista comenzi ; } executa lista de comenzi in cadrul procesului curent (atentie la punct si virgula inainte de acolada de inchidere). Ex.: $ pwd ; {cd ../test ; pwd ; } ; pwd /users/u1/demo /users/u1/test /users/u1/test Efectul comenzii cd se pastreaza si dupa terminarea listei de comenzi din acolade.

Lansarea comenzilor in fundal Unele procese sunt neinteractive si au o durata mare de executie. Pentru astfel de procese, sistemul UNIX prevede un mod special de executie, in fundal (background). Pentru lansarea executiei in fundal a unui proces, comanda trebuie terminata cu caracterul &. De ex.: $ calcul & Odata executia pornita, sistemul afiseaza identificatorul procesului lansat in fundal si apoi prompter-ul, utilizatorul putand introduce alte comenzi. Acestea pot fi executate in prim plan (foreground) sau in fundal (background), daca se specifica acest lucru. Distrugerea proceselor ce ruleaza in fundal se realizeaza cu ajutorul comenzii kill, avand ca parametru identificatorul procesului vizat, comunicat de sistem la lansarea procesului in fundal. (nu se poate realiza cu CTRL+C deoarece procesele in fundal nu interactioneaza cu utilizatorul prin terminal). Uzual, se executa in fundal procese care au o durata mare si care iau datele de intrare din fisiere deja pregatite, punand rezultatele in alte fisiere, pe care utilizatorul le poate inspecta si folosi ulterior. La terminarea executiei unui astfel de proces, interpretorul de comenzi afiseaza un mesaj informativ, de genul 'procesul cu identificatorul ... s-a terminat'. Fisiere standard. Redirectare Dupa initializarea sesiunii de lucru, se deschid 3 fisiere standard (0, 1 si 2) pentru intrare, iesire si afisarea erorilor. Ele sunt atribuite terminalului de la care se lucreaza (tastatura si ecranul). In momentul lansarii in executie a programului asociat unei comenzi, acesta mosteneste (ca proces "fiu") fisierele deschise, deci si pe cele standard. Interpretorul de comenzi permite insa redirectarea fisierelor standard spre alte periferice: cu '<' se redirecteaza fisierul standard de intrare. Acest lucru inseamna ca programul lansat in executie nu va lua datele de intrare de la tastatura, ci din fisierul indicat dupa '<'; cu '>' se redirecteaza fisierul standard de iesire. Informatia ce trebuie afisata pe ecranul terminalului va fi scrisa in fisierul indicat dupa '>'. De exemplu, $ ls -l >fis va crea fisierul fis, unde va depune informatiile din directorul curent. Daca fisierul fis exista anterior si dorim sa se pastreze informatia din el se foloseste operatorul '>>' in loc de '>' (operatia append).

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 functia: tipareste numele (calea) directorului curent; sintaxa: pwd 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 functia:schimba directorul curent sintaxa: cd (director) explicatii:se abandoneaza directorul curent iar directorul specificat devine director curent. cd .. -directorul parinte devine director curent; 3. ls functia:listeaza continutul unui director; sintaxa:ls [optiuni] (fisier)... explicatii:Se afiseaza la terminal continutul 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: d pentru fisier director; c pentru fisier special de tip caracter; b pentru fisier special de tip bloc; - pentru fisier ordinar; 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;

Exemplificare parametri comanda ls ls a afiseaza si fisierele ascunse ex: .profile ls l afiseaza informatii suplimentare legate de fisiere ls al combina situatiile de mai sus ls alr afiseaza informatii suplimentare despre fisiere si inclusiv subdirectoare ls d afiseaza informatii despre director si nu despre continutul lui ls F afiseaza informatii in legatura cu tipul fisierului astfel: * - fisier executabil @ - legatura simbolica Nici un simbol - fisier ascii

4. mkdir functia:creaza un director nou sintaxa:mkdir (director) explicatii:Creaza un nou director, cu numele specificat, pe care il leaga la directorul curent. Sunt setate automat si drepturile de acces. 5. rmdir functia:sterge un director sintaxa:rmdir (director) explicatii:Directorul specificat este sters doar daca este vid; daca directorul nu este vid, este necesara stergerea prealabila a fisierelor continute folosind comanda rm.

Utilizarea comenzii rm pentru stergerea unui fisier

Utilizarea comenzii rm pentru stergerea unui director cu continut

Comenzi informative si pentru terminale 1. man functia:afiseaza capitole din manualul de utilizare sintaxa:man [optiuni] [(capitol)] (sectiune) 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 functia:afiseaza calendarul sintaxa:cal [luna] an explicatii:Clar !

3. date functia: afiseaza data si ora sintaxa:date 4. finger functia:afiseaza numele utilizatorilor conectati la sistem sintaxa:finger [(nume)] explicatii:Daca se specifica numele unui utilizator, se dau informatii despre acesta

5. passwd functia:schimba parola sintaxa:passwd 6. tty functia: afiseaza numele terminalului sintaxa: tty

7. write functia: trimite imediat un mesaj la un alt utilizator sintaxa:write (utilizator) explicatii:Dupa scrierea comenzii se scrie mesajul, incheiat cu CTRL+D

Precizati functia si sintaxa comenzii last. Comenzi pentru gestiunea fisierelor 1. cat functia:concateneaza fisiere text si afiseaza sintaxa:cat (fisier) 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 >fisiernou concateneaza fisierele fis1 si fis2 si depune rezultatul in fisiernou; comanda este echivalenta cu cat fis[12] >fisiernou

cat >fis permite crearea unui fisier text de la tastatura, introducerea continutului terminindu-se cu CTRL+D;

Comanda tac este inversa comenzii cat, producand afisarea unui fisier linie cu linie de la sfirsitul lui catre inceputul acestuia. Comenzile head si tail produc afisarea primelor, respectiv ultimelor n linii dintr-un fisier (n fiind specificat ca optiune).

Comanda pg realizeaza afisare cu paginare, iar od permite obtinerea imaginii memorie a unui fisier.

2. lpr 3. wc

functia:tipareste un fisier text la imprimanta sintaxa:lpr [optiuni] [(fisier)...] functia:numara caracterele, cuvintele si liniile unui fisier text; sintaxa:wc [optiuni] [(fisier)...] explicatii:Optiunile sunt:
1. 2. 3. 4. 5. -w pentru numararea cuvintelor; -c pentru a numara bytes; -l pentru numararea liniilor; -m numara caracterele utilizate -l* toate optiunile de mai sus

4. diff functia:gaseste diferentele dintre doua fisiere text sintaxa:diff [optiuni] (fis1) (fis2) 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 precedate de < apar in fis1 si nu apar in fis2.

diff i fisier1.txt fisier2.txt ignora diferentele de litere mari si mici diff c fisier1.txt fisier2.txt afiseaza toate diferentele

5. grep functia:filtreaza liniile unui fisier text cautand sabloane sintaxa:grep [optiuni] [sir de caractere] (fisier) 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: 1. c produce un contor al liniilor ce contin sablonul, in loc de a le afisa; 2. v afiseaza liniile care nu contin sablonul 3. i ignora diferentele dintre literele mici si mari 4. w cauta un cuvant

Exemple :

5. n 6. l

afiseaza numarul liniei pe care a identificat sablonul cautat listeaza numele fisierelor ce contin sablonul cautat

Daca sirul de cautare contine spatiu este necesar sa il precizam intre ghilimele.

Pentru a cauta un anumit sablon in fisierele din directorul curent utilizam tag-ul l astfel :

Daca stim ca sirul de cautare se afla la inceputul unei linii atunci vom preciza la inceputul sirului de cautare accentul circumflex ^ si simbolul $ pentru sfarsitul liniei astfel :

Astfel identificam o linie goala de continut.

Astfel identificam o linie ce contine un singur caracter.

Pentru a realiza cautarea sablonul poate avea una din urmatoarele sintaxe: Sablon abc [abc] [^abc] [a-c] . Explicatie Exact acest string: abc Unul dintre aceste caractere: a, b sau c Niciunul dintre aceste caractere nu trebuie sa apara Un caracter ntre a si c Orice caracter

Alte exemple:

Pentru a cauta in fisiere arhivate se utilizeaza comenzile zgrep si bzgrep. 6. comm functia:gaseste si afiseaza toate liniile comune a doua fisiere text; sintaxa:comm [optiuni] (fis1) (fis2) explicatii:Cele doua fisiere vor trebui prealabil sortate alfabetic (functia sort).

7. file functia:determina tipul unui fisier sintaxa:file (fisier)... 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. file f* afiseaza tipul fisierelor a caror denumire incepe cu simbolul f

8. find

fisierele care satisfac acea conditie. Conditiile se precizeaza prin optiuni: 1. name (fisier) - specifica numele fisierului cautat; 2. atime [+|-] (n) - specifica toate fisierele accesate in ultimele n zile; 3. mtime [+|-] (n) - specifica toate fisierele modificate in ultimele (n) zile; 4. print - pentru afisarea pe ecran este -print. 5. type (i) - specifica tipul fisierului cautat:f-ordinar, d-director c -special caracter, b-special bloc; 6. -perm mod - cauta toate fisierele care satisfac criteriul de permisiuni specificat (folosind notatia octala). 7. -size - cauta toate fisierele care au dimensiunea exacta, mai mare (+) sau mai mica (-) decat n (n reprezinta blocuri de 512 octeti, sau caractere daca este urmat de c). 8. -exec - comenzile specificate ca argumente sunt executate de interpretorul de comenzi in loc sa se creeze procese separate de executie; daca se doreste rularea comenzilor in procese separate ele se scriu direct, asa cum se scriu si in linia de comanda. Afisarea arborelui de directoare cu ajutorul comenzii find .

functia:gaseste un fisier intr-un subarbore al sistemului de fisiere sintaxa:find (director)...(conditie) explicatii:Se cauta in directoarele specificate si in subdirectoarele lor

Exemplificare : Cautarea tuturor fisierelor care au o denumire ce incepe cu f find ~/director -name f* print Cautarea tuturor fisierelor care au anumite permisiuni: find ~/ director -perm 644 -print

Pentru a afisa calea si continutul directorului curent inclusiv fisierele subdirectorului subdir putem utiliza optiunea prune a comenzii find dupa urmeaza. Atentie la cele doua comenzi ilustrate si diferentele dintre ele!

Pentru a afisa calea si continutul directorului curent exclusiv fisierele subdirectorului subdir putem utiliza optiunea prune a comenzii find dupa urmeaza.

In continuare veti observa un exemplu de utilizare a comenzii find cu optiunea exec. In sectiunea exec se dau drepturi de acces complete fisierelor identificate cu ajutorul comenzii find. In sectiunea exec a comenzii find se poate utilize orice comanda cunoscuta de dvs.

Sintaxa acestor exemple este in conformitate cu distributia instalata pe serverul infocib.ase.ro. Daca veti testa aceste comenzi distributia instalata pe serverul venus.ase.ro utilizati urmatoarea sintaxa: find . -name "f*" -exec chmod 777 '{}' \; -print find . -name "f*" -exec grep "bin/bash" '{}' \; -print find . -name "f*" -exec grep "bin/bash" '{}' \; -print

In urmatorul exemplu se vor afisa doar fisierele a caror nume incepe cu litera s si contin sablonul

bin/bash.

Sintaxa acestor exemple este in conformitate cu distributia instalata pe serverul infocib.ase.ro. Daca veti testa aceste comenzi distributia instalata pe serverul venus.ase.ro utilizati urmatoarea sintaxa: find . -name "f*" -exec grep "bin/bash" '{}' \; -print

9. rm functia:sterge fisiere sintaxa:rm [optiuni] (fisier)... explicatii: Sterge fisierele indicate din directorul curent. Principalele optiuni permise sunt: 1. -i -intreaba utilizatorul inainte de stergerea fiecarui fisier; 2. -r -cere confirmarea de stergere inainte de stergerea fiecarui subdirector; 3. -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 functia:muta/redenumeste un fisier sintaxa:mv (fis1) (fis2) sau mv (fisier)...(director) explicatii:In prima forma va redenumi fis1, iar in a doua forma va muta fisierele specificate in directorul (director) Utilizarea comenzii mv pentru redenumirea unui fisier din directorul curent si a unui subdirector din directorul curent

11. crypt

functia:cifreaza un fisier sintaxa:crypt [parola] < (fis1) >(fis2) explicatii: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.

12. cp functia: copiaza un fisier sintaxa:cp (fis1) (fis2) sau cp (fisier)...(director)

Utilizarea comenzii cp pentru copierea tuturor fisierelor dintr-un director sursa intr-un director destinatie.

13. chown si chgrp functia:schimba proprietarul, respectiv grupul, la care este afiliat un fisier sintaxa:chown (nou proprietar) (fisier) chgrp (nou grup) (fisier) 14. chmod functia:schimba drepturile de acces pentru un fisier

facandu-se sub forma: (cine) (op) (drept), unde: 1. (cine) reprezinta:u-proprietar, g-grupul, o-ceilalti,a (toti) 2. (drept)-r,w,x 3. (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;

sintaxa:chmod (drepturi) (fisier) explicatii:Comanda poate fi utilizata doar de proprietarul fisierului, precizarea drepturilor

Comenzi pentru gestiunea fisierelor 15. Pentru a salva spatiu pe disc si a nu face o copie a unui fisier, de multe ori putem crea o legatura (link) catre acesta. In acest mod putem accesa fisierul specificat si din alte locatii de pe hard disk. Crearea de astfel de fisiere tip legatura este utila atunci cand mai multi utilizatori trebuie sa lucreze asupra aceluiasi fisier (un proiect la care lucreaza o echipa de programatori, de exemplu) sau atunci cand se doreste o referinta la un fisier utilizandu-se un nume mai scurt. Comanda folosita este comanda ln (link) iar formatul general al este: ln fisier fisier_nou Comanda anterioara creaza un link pentru fisierul fisier in directorul curent, cu numele fisier_nou; pentru crearea unei legaturi in alt director decat cel curent, vom folosi formatul: ln fisier director/fisier_nou Atunci cand este creat un fisier, este creata o legatura dintre director si acel fisier. Numarul de legaturi pentru fiecare fisier este de cel putin 1 (referinta proprie). Numarul de legaturi este afisat in cea de-a doua coloana a listingului comenzii ls -l. De fiecare data cand este creata o legatura catre un fisier, numarul de legaturi ale acelui fisier este incrementat.

16. In sistemele de operare Unix arhivarea si comprimarea sunt 2 termene separate. Prin arhivare se intelege crearea unui fisier care contine mai multe fisiere si directoare, pentru ca operatia de copiere pe o discheta sau banda sa fie mult mai simpla. Prin comprimare se intelege compresia datelor pentru a ocupa mai putin spatiu. Cele mai intalnite optiuni ale comenzii tar sunt c, t si x. Spre deosebire de majoritatea comenzilor UNIX, aceste optiuni nu trebuie neaparat precedate de semnul minus (-). Sintaxa generala a comenzii este urmatoarea: tar functie [modificator] [fis_iesire] nume_fis |nume_dir Functiile comenzii tar sunt urmatoarele: c (create) - este utilizata pentru a crea o arhiva dintr-un singur fisier sau director sau din mai multe fisiere sau directoare; t (table of contents) - este utilizata pentru a vedea un tabel cu continutul arhivei. Acest tabel reprezinta un listing cu fisierele ce compun fisierul arhiva de tip tar; x (extract) - este utilizata pentru a extrage fisiere dintr-o arhiva si a le separa din nou. Fisierul arhiva tar exista si dupa aceasta extragere. Cei mai utilizati modificatori ai functiilor sunt: f (file) - permite specificarea unui fisier tar pentru creare (c), extragere (x) sau vizualizarea tabelei de continut (t); v (verbose) - executa comanda in modul vorbaret care permite sa vedem rezultatele detaliate ale comenzii tar pe masura ce aceasta ruleaza. Arhivarea fisierelor text din directorul curent si dezarhivarea lor utilizand tar

Toate fisierele, inclusiv cele arhivate cu comanda tar, pot fi comprimate. Operatia de compresie a fisierelor este o operatie deosebit de utila deoarece reduce spatiul ocupat pe hard disc si in acelasi timp face ca fisierele comprimate sa fie disponibile pentru o utilizare ulterioara. Fisierele comprimate cu comanda compress sunt inlocuite cu un fisier cu acelasi nume cu cel original, dar care are extensia .Z (atentie, litera mare Z). 17. Comanda compress ofera posibilitatea compresiei mai multor fisiere o data, precum si folosirea metacaracterelor pentru specificarea mai multor fisiere. Ex: compress numefisier|numearhiva Pentru decomprimare nu este neaparat necesar sa specificam extensia .Z, avand in vedere ca aceasta comanda cauta automat fisierul cu extensia implicita .Z. De asemenea, se pot decompresa mai multe fisiere o data, folosind metacaracterele * si ?. Pentru a vizualiza continutul unui fisier comprimat fara a face efectiv decomprimarea, se poate folosi optiunea c astfel:

18. Comanda jar (Java archive) este asemanatoare cu comanda tar, dar inglobeaza si compresia fisierului intr-un singur pas. Fisierele arhivate sunt compresate prin intermediul

aplicatiei Java jar intr-o arhiva de acest tip. Utilitarul jar reprezinta un instrument de arhivare bazat pe formatele de compresie zip si zlib. Comanda jar este o comanda standard pentru sistemul de operare Solaris dar este disponibil pe orice sistem ce are instalat masina Administrarea fisierelor si directoarelor virtuala Java (JVM - Java Virtual Machine). Sintaxa generala a comenzii este foarte asemanatoare cu aceea a comenzii tar. Optiunile disponibile pentru comanda jar sunt urmatoarele: c Creeaza o noua arhiva jar t Listeaza continutul fisierului jar x Extrage fisierele specificate din arhiva jar v Specifica executia in modul verbose Exemplu de utilizare comanda jar

19. Comanda sort daca este apelata fara nici un parametru, ea va astepta introducerea liniilor de text de la tastatura (intrarea standard), pana la introducerea caracterului CTRL+D, dupa care va sorta liniile si le va afisa in ordine pe ecran (iesirea standard). Exemplu: comanda urmatoare preia liniile care trebuie sortate din fisierul date.txt, iar rezultatele vor fi afisate pe ecran. Se redirecteaza, deci, numai intrarea standard: sort < date.txt Pentru a redirecta numai iesirea, adica liniile de text sa fie citite de la tastatura, dar rezultatul sa fie scris intr-un fisier, se foloseste urmatoarea forma: sort > ordonat.txt Redirectarile se pot combina, astfel incat liniile sa fie citite dintr-un fisier, iar rezultatul sa fie scris in altul: sort < date.txt > ordonat.txt Comenzi pentru gestiunea volumelor 1. df afiseaza spatiul liber existent pe disc 2. du - tipareste sumarul privind utilizarea discului intr-un subarbore Comanda du k afiseaza dimensiunea in blocuri de cate 1KB;

3. mount - montarea unui sistem de fisiere 4. unmount demontarea unui sistem de fisiere Comenzi pentru gestiunea proceselor 1. kill oprete un proces n curs de execuie kill -9 PID_proces 2. nice funcia: lanseaz un proces cu prioritate redus. Prioritatea este un numr. O prioritate mare nseamn un numr mic. Administratorul poate lansa procese cu prioritate negativ. Prioritile utilizate cu aceast comand trebuie s fie pn la 20, altfel dac prioritatea nu se precizeaz se incrementez cu 10 prioritatea implicit a sistemului. Procesele lansate cu nice sunt procese care necesit un timp ndelungat de execuie i ca atare se lanseaz n background. 3. at funcia: lanseaz n execuie un fiier de comenzi Shell la un moment de timp specificat sintaxa: at timp [data] [fiier] at 17 jan2 prog.sh - pe 2 ian. ora 17

4. atq

funcia: afieaz procesele lansate n execuie utiliznd comanda at (cele care nc nu sau lansat sau care se afl n coada de ateptare)

5. atrm

funcia: terge procesele lansate n execuie utiliznd comanda at (cele care nc nu s-au
lansat sau care se afl n coada de ateptare). Opiunea a se utilizeaz dac dorii s tergei toate task-urile iar opiunea -i dac dorii confirmare la tergerea task-urilor planificate.

6. ps

funcia: ofer informaii despre procesele active. Indic PID sau identificatorul procesului,

PPID sau identificatorul procesului printe, TT terminalul de control al procesului, STAT starea procesului(starea execuiei, dac imaginea procesului se afl n memorie, prioritatea procesului), TIME durata procesului. Procesul poate fi n execuie(r), n ateptare(w), suspendat(s), oprit(t), terminat(y) sau inexistent(o).

ps -ef | grep nume_script identifica PID-ul procesului ce ruleaza in bucla infinita ps ef afiseaza toate procesele in curs de executie ps -a afieaz toate procesele asociate cu terminalul

ps -l afieaz toate informaiile despre procese

7. sh - lanseaz n execuie interpretorul Shell 8. sleep - suspend temporar execuia unui proces 9. time - furnizeaz timpul de execuie a unei comenzi

Pentru a gestiona mai uor fiierele i directoarele putei utiliza utilitarul mc(midnight commander).

Expresii Expresiile regulate au rolul de a specifica multimi de siruri de caractere. Ele stabilesc un sablon pentru potriviri de text. Sunt utilizate in general pentru a identifica dintr-un text anumite siruri de caractere. Expresiile regulate descrise aici sunt recunoscute de majoritatea programelor utilitare. Editorul vi respectiv ed permit facilitati suplimentare. In general orice caracter ce apare intr-o expresie regulata identifica un caracter din text. Exista insa anumite caractere speciale care permit definirea de sabloane variabile. In expresiile regulate se utilizeaza doua tipuri de caractere: caractere alfanumerice, care desemneaza exact caracterele reprezentate; caractere speciale sau operator care desemneaza repetitii, alegeri, optiuni, etc. Caractere speciale: \ Caracter de protejare - anuleaza semnificatia speciala a caracterului care il urmeaza. . Caracter arbitrar (orice caracter). * + Operatori de repetitie: a* orice numar de caractere a, chiar 0; a+ orice numar de caractere a, cel putin unul. $ La sfrsitul unei expresii regulate marcheaza un sfrsit de linie. ^ La inceputul unei expresii regulate marcheaza inceput de linie. [s] Desemneaza o multime de caractere. In multimea s singurele caractere speciale sunt: -, ] si ^. De exemplu: [abc] Unul dintre caracterele a, b sau c. [A-Za-z] O litera. [][] Unul dintre caracterele ']' sau '['. Caracterul '^' complementeaza o multime daca este la inceput. De exemplu: [^0-9] Caracter nenumeric. O secventa de caractere dintr-o expresie regulata se poate delimita prin '\(' si '\)'. Constructia este numita expresie regulata marcata. Aceasta expresie poate fi referita apoi prin '\i' cu i intre 1 si 9. De exemplu, expresia: \([a-z]*\)\&\1 Selecteaza sirul 'adi\&adi'. Doua expresii regulate separate prin '|' semnifica una dintre ele (alternativa). De exemplu: (ab|cd+)?(ef)* Pe prima pozitie apare sau nu, ab sau c urmat de cel putin un d, si urmat de oricte grupuri de ef. Expresiile regulate intre paranteze simple realizeaza o grupare. De exemplu: (a|b)(c|d) Identifica ac, ad, bc sau bd. " Toate caracterele situate intre " isi pierd semnificatia speciala. / Indica contextul urmator. De exemplu: ab/cd ab doar daca este urmat de cd. {} Semnifica repetitii ale unei expresii. De exemplu: a\{1,5\} Una pna la cinci aparitii ale lui a. exp\{6,\} Cel putin 6 aparitii ale expresiei exp. exp\{2\} Exact doua aparitii ale expresiei exp. [0-9]\{2,\} Secventa din doua sau mai multe cifre. Daca mai multe caractere speciale apar intr-o expresie regulata se aplica regula de precedenta. Conform acesteea, precedenta cea mai mare o are [] dupa care grupul *, + si ? si ultimul este |. La inlocuirea sirurilor de caractere specificate prin expresii regulate caracterul '&' identifica expresia regulata. Pentru a genera caracterul '&' acesta trebuie prefixat de \. Caracterul '\' urmat de <Enter> genereaza o linie noua. Editorul vi. Modurile de lucru in vi Pentru editorul vi exista trei moduri de lucru: modul comanda, modul introducere si modul ultima-linie (last line). Toate comenzile disponibile in vi pot fi clasificate in unul dintre aceste trei moduri de lucru. sintaxa: vi [-r | -R] [+poziionare] [fiier] unde:

-r ncarc ultima versiune salvat nainte de cderea sistemului. -R Se interzice modificarea coninutului fiierului. Dac se specific poziionare cursorul se poziioneaz pe linia specificat (+ nr_linie) sau pe irul cutat (+/sir_cutat). Caracteristicile de baza ale celor trei moduri de lucru sunt urmatoarele: 1. Modul comanda - este modul initial de lucru folosit pentru crearea si editarea fisierelor, pozitionarea cursorului si modificarea textului deja existent. Toate comenzile se introduc plecand de la acest mod de lucru. Apasarea tastei <ESC> din unul din celelalte doua moduri de lucru determina trecerea in modul comanda; 2. Modul introducere (sau editare) - este utilizat pentru introducerea de text. Introducerea unei comenzi de genul i (pentru inserare), a (pentru adaugare) sau o (pentru deschiderea unei linii noi) determina trecerea din modul comanda in modul introducere. Apasarea tastei <ESC> determina intoarcerea in modul comanda. Comenzile de introducere sunt date fara a se apasa dupa ele tasta <ENTER>; 3. Modul ultima-linie - este folosit pentru salvarea documentului editat si pentru iesirea din vi. Apasarea tastei : determina trecerea in acest mod de lucru. Apasarea tastei <ENTER> sau a tastei <ESC> determina trecerea in modul comanda. Modul comanda este modul initial de lucru al editorului vi. In momentul pornirii editorului vi, automat se intra in modul comanda. In acest mod de lucru se pot introduce fie comenzi pentru pozitionarea cursorului in cadrul fisierului, fie comenzi de editare pentru inserarea de noi caractere sau modificarea continutului deja existent. Pentru a ajunge din modul introducere in modul ultima-linie sau invers, trebuie sa trecem mai intai prin modul comanda. Toate comenzile sunt initiate din modul comanda. Apasarea tastei <ESC> ne plaseaza mereu in modul comanda, de aceea putem utiliza tasta <ESC> in cazul in care nu stim in ce mod de lucru ne aflam. Modul introducere (editare) reprezinta modul in care trebuie sa ne aflam pentru a introduce text. Pentru introducerea de text, trebuie sa dam o comanda (prin simpla apasare a unei taste) cum ar fi i (insert - inserare), o (open new line - linie noua) sau a (append - adaugare). Introducerea unei dintre comenzile anterioare determina trecerea din modul comanda in modul introducere. In acest mod putem introduce noi caractere in textul initial, apoi putem apasa tasta <ESC> pentru a ne intoarce in modul comanda. Modul ultima-linie este modul in care putem ajunge prin apasarea tastei :, ceea ce determina pozitionarea cursorului pe ultima linie a ecranului (de aici provine si denumirea acestui mod de lucru). Modificarile facute asupra fisierului sunt mentinute intr-o memorie tampon pana in momentul in care acestea sunt salvate pe disc. Utilizand modul ultima-linie, putem salva periodic modificarile facute asupra fisierului fie ramanand in vi, fie salvand si parasind editorul. De asemenea, se poate iesi din editor fara a salva modificarile facute. Modul ultima-linie este folosit si pentru a cauta siruri de caractere sau pentru a seta anumite preferinte de editare. Pentru a salva un fisier si a iesi din editorul vi, trebuie mai intai sa ne pozitionam in modul de lucru ultima-linie prin apasarea tastei :. Pentru a salva fisierul este de ajuns sa tastam :w. Daca dorim sa salvam fisierul cu alt nume, vom introduce comanda :w nume_nou_fisier. Pentru a salva fisierul si a iesi din vi, se poate tasta fie :wq, fie ZZ (direct din modul comanda). Daca dorim sa iesim din fisier fara sa salvam modificarile facute, putem introduce comanda :q!. In cazul in care se deschide un fisier read-only (poate fi doar citit, nu si modificat) care se doreste a fi modificat, se pot salva modificarile facute prin introducerea comenzii :wq! (write-quit). Daca se doreste renuntarea la toate modificarile facute de la ultima salvare, se poate folosi comanda :e! (erase) care sterge modificarile din buffer si incepe editarea din nou

Comenzi de baza pentru pozitionarea cursorului in vi Comanda j (sageata in jos) k (sageata in sus) h (sageata stanga) l (sageata dreapta) Tasta <SPACE> w b $ 0 sau ^ Tasta <RETURN> Deplasare Deplasare Deplasare Deplasare Deplasare Deplasare Deplasare Deplasare Deplasare Deplasare o linie in jos o linie in sus cu un caracter la stanga cu un caracter la dreapta la dreapta cu un caracter la dreapta cu un cuvant la stanga cu un cuvant la sfarsitul liniei la inceputul liniei la inceputul liniei urmatoare

Comenzi de baza pentru stergerea textului in vi Comanda x dw 5dw dd 2dd 3x Se Se Se Se Se Se sterge caracterul din dreptul cursorului sterge cuvantul situat la dreapta cursorului sterg 5 cuvinte la dreapta sterge intraga linie pe care este pozitionat cursorul sterg 2 linii incepand cu linia curenta sterg 3 caractere incepand cu cel din dreptul cursorului

Comenzi de baza pentru copiere, alipire, modificare si anulare in vi Comanda cw Are ca efect modificarea cuvantului (sau a partii din cuvant) de la cursor pana la sfarsitul cuvantului. Se pozitioneaza cursorul in locul de unde dorim sa incepem modificarea, apoi se apasa cw, se introduce noul cuvant si se apasa in final tasta <ESC> Se modifica 5 cuvinte Se inlocuieste caracterul pe care este pozitionat cursorul cu alt caracter Are ca efect anularea ultimei comenzi Sterge, apoi alipeste (paste) Copiaza, apoi alipeste Copiaza o linie Alipeste linia copiata sau stearsa sub linia curenta Alipeste linia copiata sau stearsa deasupra liniei curente

5cw r u dd, apoi p yy, apoi p yy p P

Vom construi un program (shell-script) care cuprinde comenzi UNIX si constructori de control shell; utilizand editorul vi , vom scrie comenzile si constructiile shell si vom salva fisierul cu un nume oarecare (script.sh, spre exemplu). Liniile din cadrul shell-script-ului vor fi interpretate una cate una de catre shell (avem de-a face cu programe interpretate, nu compilate). De regula, prima linie dintr-un fisier shell-script indica tipul de shell utilizat. Spre exemplu, daca folosim shell-ul Bourne, prima linie va arata astfel: #!/bin/sh iar daca utilizam shell-ul bash, prima linie va arata: #!/bin/bash Dupa ce salvam fisierul, trebuie sa ii dam drepturi de executie (vom folosi comanda chmod) si in acest moment suntem gata sa il rulam. Putem lansa in executie programul intitulat script.sh astfel (./ semnifica faptul ca acesta se afla in directorul de lucru curent): $ ./script.sh

Vom edita urmatorul shell script in vi: #! /bin/csh -f foreach name ($argv) if ( -f $name ) then echo -n "delete the file '${name}' (y/n/q)?" else echo -n "delete the entire directory '${name}' (y/n/q)? " endif set ans = $< switch ($ans) case n: continue case q: exit case y: rm -r $name continue endsw end

Editai fiierul de mai sus utiliznd editorul mcedit i editorul joe.

n cadrul editorului joe amintim combinaiile de taste (comenzi) permise, ca:

Ctrl Z salt la cuvntul precedent Ctrl X salt la urmtorul cuvnt Ctrl K F cutare n text Ctrl L continuarea cutrii Ctrl K L salt la o anumit linie Ctrl K B marcheaz nceputul blocului Ctrl K K marcheaz sfritul blocului Ctrl K M mut coninutul blocului Ctrl K C face o copie a coninutului blocului Ctrl K Y terge coninutul blocului Ctrl Y terge linia curent Ctrl K X parasete editorul salvnd fiierul.

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 Operatori:

Pentru fisiere:

-d <fis> este director? -f <fis> este fisier obisnuit? -r <fis> poate fi citit? -s <fis> are lungime diferita de 0? -w <fis> poate fi modificat? -x <fis> este fisier executabil?

Exemple: $ ls -las
$test f stud.dat; echo $? $test d stud.dat; echo $? $test w stud.dat; echo $? $[ -r stud.dat ] ; echo $? $[ -w stud.dat ] ; echo $?

Pentru siruri de caractere:


<sir> este sirul nenul? -n <sir> are sirul lungimea diferita de 0? -z <sir> are sirul lungimea 0? <sir1>=<sir2> sirurile sunt identice?

<sir1>!=<sir2> sirurile sunt diferite?

Exemple:
$sir2 =maria $sir3 =dan $sir4 = Care din urmatoarele comenzi au ca exit status 0? [ $sir1 = $sir2 ];echo $? [ - z $sir3 ];echo $? [ - n $sir4 ];echo $? [ $sir1 = $sir3 ];echo $? [ $sir4 ];echo $?

$sir1 =dan

Pentru tipul integer:


-eq -ge -gt -le -lt -ne

int1=int2 int1>= int2 int1> int2 int1<= int2 int1< int2 int1 diferit de int2

Exemple:
$int2 =10 $int3 =55 $int4 =5 Ce afiseaza comenzile? [ $int1 -gt $int2 ];echo $? [ $int2 -lt $int3 ];echo $? [ $int4 -le $int1 ];echo $? [ $int3 -ne $int4 ];echo $? [ $int4 -ge $int1 ];echo $? $int2 =7

$int1 =5

$int1 =007

[ $int1 = $int2 ];echo $? [ $int1 -eq $int2 ];echo $?

Pentru tipul boolean:


!<exp> expresie falsa? <exp1> -a <exp2> ambele adevarate? <exp1> -o <exp2> una din ele adevarata?

Exemple:
$v2 =10 Ce afiseaza comenzile? [ !$v1 -eq $v2 ];echo $? [ -f stud.dat a x stud.dat ];echo $? [ $v1 -gt 1 a $v1 lt 90 ];echo $?

$v1 =5

Alte exemple:

comanda1 && comanda2: comanda2 se executa doar daca exit status-ul comenzii 1 este comanda1 || comanda2: comanda2 se executa doar daca exit status-ul comenzii 1 este diferit de 0 [ -x script.sh ] && ./script.sh

Pentru tipul logic: && ||

test ! -s $f - returneaza valoarea 0 daca fisierul cu numele continut de variabila $f este vid. test -d $f -a -x $f - returneaza 0 daca fisierul $f este un director si avem drept de executie. 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.

Exemplu:

Operatori aritmetici: +,-,*,/,% OBS


Exemplu: $x =5
$y =10 $z=10

operanzii si operatorii se separa intotdeauna prin spatii caracterul * este special si atunci se va utiliza intotdeauna insotit de caracterul \

expr $x \* $y \* $z operatia de incrementare: var = ` expr $var + 1 `

Variabile Shell Referirea variabilelor: $var Atribuire valori: var= valoare 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 = ! In bash exista patru interpretari ale valorii unei variabile, astfel : 1. nu este incadrata intre ghilimele ( $var ) - sirul de caractere atribuit variabilei ramane la fel, cu exceptia spatiilor albe consecutive, care sunt reduse la unul singur 2. intre ghilimele simple ( $var ) - sirul de caractere isi pastreaza valoarea literala, adica NU se inlocuiesc variabilele ce apar in interiorul sirului cu valorile lor 3. intre ghilimele duble ( $var ) - variabilele sunt expandate si sunt permise caractere speciale ( de ex. \n, \t, \nnn pt. caracter ASCII in octal etc.) ; in plus, spatierea in cadrul sirului se pastreaza (variabila se comporta ca un singur cuvant) 4. intre backquotes ( `$var` ) - valoarea expresiei $var este output-ul obtinut in urma executiei efective a sirului de caractere $var Diferentele sunt ilustrate in exemplul urmator:

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 ; Variabilele utilizate in testare sunt incadrate de ghilimele acestea avand rolul de separator pentru caracterul null; Sunt de 3 tipuri: 1. Ale sistemului 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 !!! initializate de shell la deschiderea unei sesiuni cu valori precizate in fisierele /etc/environment, /etc/profile, .profile din HomeDirectory; acestea sunt: $HOME - contine calea de acces absolut spre directorul personal, $PATH -contine caile in care shell cauta programele, de regula /usr/bin si /bin, $PS!, $PS@, $LOGNAME, $MAIL, $SHELL, $TERM lista acestor variabile de mediu poate fi vizualizata cu ajutorul comenzilor env sau set

exemplu: prin intermediul variabilei PS1 avem posibilitatea de a defini prompterul intr-o maniera rafinata. Observati care este setarea implicita a variabilei PS1 executand comanda set|more. Veti constata ca pe serverul venus.ase.ro PS1= \s-\v\$ \s semnifica numele shell-ului, \v versiunea curenta bash, \$ simbolul $. In ecranul urmator veti vizualiza cum se poate schimba prompter-ul.

Identificam care este tipul de shell implicit.

Schimbam calea curenta catre directorul personal.

Un shell script care verifica tipul utilizatorului legat utilizand doua variabile de sistem : $USER si $ROOTUSER_NAME.

Scriptul rescris utilizand alte variabile de sistem $UID si $ROOT_UID.

Alte variabile de sistem.

In terminologia Unix, se folosesc termenii de variabila de shell si variabila de mediu, cu semnificatii diferite: variabila de shell este o variabila accesibila doar procesului shell curent, pe cind variabila de mediu este o variabila accesibila tuturor proceselor fii ale acelui proces shell ( este o variabila exportata). 2. Ale shell-ului modificate dinamic de interpretor, pe care utilizatorul nu le poate modifica; acestea sunt: $#, $?, $$, $n (n=1-9), $@; Numarul de argumente pozitionale pentru shell: $# Numele shell script-ului este: $0 Argumentele sunt: $@ Identificatorul de proces al shell-ului activ: $$ Argumentul al 2-lea este: $2 Contine codul de revenire(exit status)a ultimei comenzi executate:$? Identificatorul (pid) ultimului proces lansat in paralel:$! 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. Urmeaza utilizarea parametrului pozitional $!. 3. Ale utilizatorului Definite de utilizator; $TEST1=HELLO WORLD $echo $TEST1 HELLO WORD Trimiterea variabilelor comenzilor

$DEMO=/usr/bin $echo $DEMO /usr/bin $cd $DEMO $pwd /usr/bin Trimiterea var. comenzilor ca parte a unei comenzi (cu{}) $name=gr1000 $echo $name gr1000 $echo ${name}a gr1000a $echo $name a gr1000 a Trimiterea iesirilor comenzilor catre variabile (comanda trebuie sa fie intre ` `, altfel o interpreteaza ca text (nu sau ) $TODAY=`date` $echo $TODAY $DIR=`ls la` $echo $DIR Definirea variabilelor de la tastatura - Pentru a avea un contact direct cu utilizatorul, in afara folosirii parametrilor de pozitie, exista pozibilitatea de a se introduce date prin intermediul comenzii read. Datele 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. $cat fisier echo Introduceti numele: read nume echo Hello $nume Operatii aritmetice (nu se permit paranteze; se utilizeaza comanda expr; trebuie sa fie spatiu intre operator si expresie; pentru inmultire se foloseste \* ) $num = 2 $expr $num +2 4 $expr $num \* 2 4 $rezultat = `expr $num \* 3` $echo $rezultat 6 Manipulari de date (concatenarea variabila) $nume=steve $prenume=norton $fullname=`echo Numele este $nume $prenume` $echo $fullname >temp

$cat temp Numele este steve norton Caracterele \, , (\ -schimba semnificatia caracterului urmator); $echo \ $a=fred $echo $a $a (afiseaza textul $a) $echo $a fred 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. In continuare se 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 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:

EXERCITIU: Ce efect are executarea acestui fisier de comenzi ? 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] Comanda echo trimite parametrii pe canalul de iesire standard. Principalele caractere speciale ale comenzii sunt: Caracter special Efect \a Alarma sonora \n Salt la linie noua \b Intoarcere \t Marcheaza un paragraf Tab \\ Afisare \ Pentru a se tine cont de caracterele speciale ce apar in sirurile de caractere date ca argumente, trebuie folosita optiunea -e, de exemplu:

Afisarea valorii unei variabile se realizeaza prin folosirea caracterului $ inaintea numelui variabilei. echo $s, afiseaza valoarea variabilei s. Citirea informaiilor se face cu ajutorul comenzii 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 read.Datele citite sunt transmise pe canalul de intrare standard si memorate in variabilele transmise 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.

Instructiuni de decizie 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.

Scriptul urmator:

Cauta numele Georgescu in fisierul lista si afiseaza un mesaj in care se precizeaza rezultatul cautarii. 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. Rescrieti scriptul conform ecranului de mai jos. Interpretati modificarile.

Vom rescrie scriptul precedent, sablonul si fisierul in care cautam fiind date ca argumente pe linia de comanda:

Rescriem scriptul precedent, testand corectitudinea liniei de comanda (se verifica daca numarul argumentelor din linia de comanda este corect).

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). Putem opta pentru rescrierea liniei ce contine comanda grep astfel : if grep "$1" "$2" >/dev/null 2>&1 In acest caz expresia 2>&1 se utilizeaza 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).

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) reprezinta "variabila" de selectie (sablon_i) reprezinta un criteriu de cautare (domeniu de valori) (comanda) reprezinta orice comanda sau succesiune de comenzi acceptate de shell 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 de utilizare a instructiunii in scriptul urmator:

Problema: Rescrieti scriptul de la instructiunea if, verificand parametrii din linia de comanda cu instructiunea case. 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 1. 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:

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

2. 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 3. Liste de valori implicite Lista de valori implicite este formata din lista parametrilor de pozitie, care este memorata variabila speciala $@ (lpr- functia tipareste un fisier text la imprimanta). for fis in $@ do lpr $fis done care este echivalent cu: for fis do lpr $fis done Exemplul urmator afiseaza continutul directorului curent, sortat dupa data ultimei modificari. for i in `ls -t` do echo $i done Determinati rezultatul executiei scriptului ce urmeaza: for fis in `find $1 -perm -u=rx -type f` do echo $fis cat $fis done

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. Determinati rezultatul executiei scriptului ce urmeaza: a=0 while [ "$a" -lt 10 ] do b="$a" while [ "$b" -ge 0 ] do echo -n "$b " b=`expr $b - 1` done echo a=`expr $a + 1` done Se poate folosi un bucla 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. Exemplul urmator afiseaza in mod continuu pe ecran, din 5 in 5 secunde, data si ora curenta.

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. Determinati rezultatul executiei scriptului ce urmeaza: a=0 until [ ! $a -lt 10 ] do echo $a a=`expr $a + 1` done 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. Scriptul (sa presupunem, ca are numele script): PS3="Introduceti un numar intre 1 si 3: " select optiune in matematica fizica informatica

do if [ -n "$optiune" ] then echo "Materia preferata este $optiune" else exit fi done

are urmatorul efect: $ script 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 $ Daca se omite lista de valori, se lucreaza implicit cu parametrii de pozitie, la fel ca in cazul instructiunii for. PS3- Variabila utilizata de comanda select, pentru a specifica un prompter care sa apara inaintea fiecarei intrari in meniul creat de utilizator. Alte comenzi

break - permite iesirea din ciclu inainte de indeplinirea conditiei; Determinati rezultatul executiei scriptului ce urmeaza: a=0 while [ $a -lt 10 ] do echo $a if [ $a -eq 5 ] then break fi a=`expr $a + 1` done Determinati rezultatul executiei scriptului ce urmeaza: for var1 in 1 2 3 do for var2 in 0 5 do if [ $var1 -eq 2 -a $var2 -eq 0 ] then break 2 // 2 reprezinta pasul la care se iese din bucla else echo "$var1 $var2" fi done done continue - permite reluarea ciclului cu urmatoarea iteratie, inainte de terminarea iteratiei curente; Determinati rezultatul executiei scriptului ce urmeaza: nr="1 2 3 4 5 6 7" for n in $nr do r=`expr $n % 2` if [ $r -eq 0 ] then echo "Numar par" continue fi echo "Numar impar" done exec cmd - comenzile specificate ca argumente sunt executate de interpretorul de comenzi in loc sa se creeze procese separate de executie; daca se doreste rularea comenzilor in procese separate ele se scriu direct, asa cum se scriu si in linia de comanda. Vezi laboratorul 3, comanda find. shift - realizeaza deplasarea argumentelor cu o pozitie la stanga ($2$1, $3$2 etc); wait [pid] - permite sincronizarea unui proces cu sfarsitul procesului cu pid-ul indicat sau cu sfarsitul tuturor proceselor "fii"; expr expresie - permite evaluarea unei expresii. Un script se editeaza intr-un editor text oarecare si se salveaza.

OBS 1. prima linie dintr-un script indica tipul de shell pe care il utilizam: vom lucra cu Bourne Shell deci prima linie va fi de forma #!/bin/sh 2. dupa salvarea fisierului se acorda acestuia drepturi de executie utlizandu-se comanda $chmod +x fis_exe 3. executia se realizeaza astfel : din linia de comanda se tasteaza ./fis_exe simbolul ./ semnifica faptul ca fisierul executabil se afla in directorul curent. Exemple shell script-uri

Pb1 Sa se verifice daca un numar, dat in linia de comanda este pozitiv sau negativ $ vi a.sh #!/bin/bash # # if [ $# -eq 0 ] then echo "$0 : Trebuie sa dati un numar argument" exit 1 fi if test $1 -gt 0 then echo "$1 numarul este pozitiv" else echo "$1 numarul este negativ" fi

Pb 2 Sa se scrie tabla inmultirii pentru un numar dat ca argument


$ vi b.sh #!/bin/bash if [ $# -eq 0 ] then echo "Eroare Dati un argument" echo "Sintaxa este: $0 number" exit 1 fi n=$1 i=1 while [ $i -le 10 ] do echo "$n * $i = `expr $i \* $n`" i=`expr $i + 1` done

Pb 3 Sa listeze continutul directorului current. Sa se stearga din directorul current fisierele care incep cu literele j si x. $ vi c.sh #!/bin/bash for file in * do ls -l "$file" # Listeaza toate fisierele din calea curenta done for file in [jx]* do rm -f $file

# Sterge numai fisierele a caror denumire incepe cu "j" or "x" din $PWD. echo "Fisierul sters: \"$file\"" done echo exit 0

Pb 4 Sa se afiseze un mesaj pentru cazul in care se scrie una din literele A,B,C $ vi d1.sh #!/bin/bash echo 'Introdu A, B, sau C: \c' read letter case $letter in A) echo 'Ati introdus A' ;; B) echo 'Ati introdus B' ;; C) echo 'Ati introdus C' ;; *) echo 'Nu ati introdus A, B, sau C' ;; esac

Pb 5 Sa se afiseze tabelul:

11111 22222 33333 44444 55555

$ vi e.sh #!/bin/bash for (( i = 1; i <= 5; i++ )) do ### Loop 1###

for (( j = 1 ; j <= 5; j++ )) ### Loop 2### do echo -n "$i " done echo "" #### trec la linie noua ### done

Pb 6 Verificarea prin preluarea ca argument a unui nume de fisier daca acesta este sau nu director $ vi f.sh #!/bin/bash var1 = student.dat if [ -f $var1 ] then echo "$var1 este un fisier obisnuit!" elif [ -d $var1 ] then echo "$var1 este director" fi

Testati urmatoarele scripturi si precizati efectul executiei lor: # copierea fisierelor intr-un director nou $ vi f.sh #!/bin/bash mkdir copie for numefisier in `ls` do cp $numefisier copie/$numefisier if [ $? -ne 0 ] then echo "operatie esuata" fi done # Genereaza copia unui fisier inainte de editare $ vi h.sh #!/bin/bash if cp "$1" "#$1" then vi "$1" else echo "Nu am putut creea copia de siguranta" fi Pb 7 $ vi h.sh #!/bin/bash contor=$# cmd=echo while true do aduna primele 5 numere pare) $ vi g.sh #!/bin/bash contor=0 rez=0 while [ $contor -lt 5 ] do contor=`expr $contor + 1` increment=`expr $contor \* 2` rez=`expr $rez + $increment` done echo "rez=$rez"

cmd="$cmd \$$contor" contor=`expr $contor - 1` if test $contor -eq 0 then break fi done eval $cmd Comanda eval este folosit n programe shell care construiesc linii de comand din mai multe variabile. Comanda e util dac variabilele conin caractere care trebuie sa fie recunoscute de shell nu ca rezultat al unei substituii. Astfel de caractere sunt: ;, |, &, < , >, ".

Pb 8 $ vi k.sh #!/bin/bash contor=$# cmd=echo while true do cmd="$cmd \$$contor" contor=`expr $contor - 1` if test $contor -gt 0 then continue fi eval $cmd exit done

Diferenta dintre executarea problemei 7 si 8

Pb 9 $ vi pb9.sh #!/bin/bash if test $# -eq 0 then ls -l | grep '^d' else for i do for j in $i/*

do if test -d $j then echo $j fi done done fi Modificati programul din exemplul 9 pentru a-i extinde efectul asupra tuturor directoarelor din subarborele directorului argument (sau al celui curent, in lipsa argumentelor). Pb 10 Compararea a doua siruri introduce de la tastatura $ vi pb10.sh #!/bin/bash echo -n "Introduceti string1: " # -n nu trece la linie noua read string1 echo -n "Introduceti string2: " read string2 if [ $string1 = $string2 ] then echo "string1 egal cu string2" else echo "string1 diferit de string2" fi

Pb 11 Compararea a doua numere introduse de la tastatura $ vi pb11.sh #!/bin/bash

echo -n "Introduceti nr1: " read nr1 echo -n "Introduceti nr2: " read nr2 if [ $nr1 -eq $nr2 ] then echo "nr1 egal cu nr2" else echo "nr1 diferit de nr2" fi

Pb 12 Convertirea unui numar din baza 10 in baza 16 $ vi pb12.sh #!/bin/bash n=0 hex=0 echo -n "Introdu numarul in baza 10 n: " read n hex=`echo "obase=16;ibase=10; $n" | bc` echo "$n in baza 10 este echivalent cu \"$hex\" in baza 16"

Pb 13 Sortarea ascendenta a cinci numere $ vi pb13.sh la executie utilizati ./pb13.sh si functioneaza. Nu utilizati comanda sh #!/bin/bash # declararea unui vector cu cele cinci numere declare vector[5]=(4 -1 2 66 10) # afisare numere echo "Numerele care se vor sorta sunt:" for (( i = 0; i <= 4; i++ )) do echo ${vector[$i]} done # sortare numere for (( i = 0; i <= 4 ; i++ )) do for (( j = $i; j <= 4; j++ )) do if [ ${vector[$i]} -gt ${vector[$j]} ]; then t=${vector[$i]} vector[$i]=${vector[$j]} vector[$j]=$t fi done done # afisarea numerelor sortate echo -e "\n Numerele in ordine ascendenta sunt:" for (( i=0; i <= 4; i++ ))

do echo ${vector[$i]} done

Pb 14 Calculul mediei unor numere date ca argument in linia de comanda $ vi pb14.sh #!/bin/bash medie=0 suma=0 nr_argumente=$# # Testam existenta a cel putin doua argumente if [ $# -lt 2 ] ; then echo -e "Introduceti cel putin doua argumente\n" exit 1 fi # calculul mediei for i in $* do suma=`expr $suma + $i` done medie=`expr $suma / $nr_argumente` echo "Media este $medie"

Pb 15 Script exemplu de utilizare a functiilor in unix $ vi pb15.sh #!/bin/bash # functie pentru eliberarea ecranului ee() { clear echo "Eliberare ecran read return } # functie pentru afisare help help() { echo "Utilizam argumentele: $0 -c "; echo "Semnificatie -c eliberare ecran"; return } if [ $# -eq 0 ] ; then help exit 1 fi while getopts cd: optiune do case "$optiune" in c) ee;; \?) help; exit 1;; esac done

Pb 16 Calcularea factorialului unui numar $ vi pb16.sh #!/bin/bash n=0 nr=0 fact=1 echo -n "Introdu numarul : " read n nr=$n while [ $n -ge 1 ] do fact=`expr $fact \* $n` n=`expr $n - 1` done echo "Factorialul numarului $nr este $fact"

Pb 17 Utilizarea comenzii tput pentru boldarea unui text introdus de la tastatura $ vi pb17.sh #!/bin/bash echo -n "introdu textul : " read text tput bold echo "$text" Pb 18 Script pentru afisarea numarului de fisiere din directorul curent $ vi pb18.sh #!/bin/bash FILE="/tmp/fisiercolector.txt" echo -n "introduceti numele directorului : " read dname ls $dname > $FILE echo "Numarul de fisiere din directorul: $(grep [^*$] $FILE -c)" #rm -f $FILE

Pb 19 Script pentru determinarea paritatii unui numar $ vi pb19.sh #!/bin/bash echo -n "Introdu numarul : " read n r=$(( $n % 2 )) if [ $r -eq 0 ] then echo "$n este par" else echo "$n este impar" fi Pb 20 Crearea unui meniu $ vi pb20.sh #!/bin/bash while : do clear echo " meniu" echo "1. Continutul directorului /etc/passwd" echo "2. Lista utilizatorilor logati" echo "3. Directorul curent" echo "4. Exit" echo -n "introduceti una din optiunile [1 - 4]" read opt case $opt in 1) echo " Continutul directorului /etc/passwd "; more /etc/passwd;;

2) echo " Lista utilizatorilor logati "; who | more;; 3) echo " Directorul curent este $(pwd)"; echo "Tasteaza enter pentru a continua ."; read enterKey;; 4) echo "La revedere $USER"; exit 1;; *) echo "$opt este o optiune invalida."; echo "Tasteaza enter pentru a continua ."; read enterKey;; esac done

Pb 21 Exemplu de utilizare a variabilei shell $USER $ vi pb21.sh #!/bin/bash ora=$(date +"%H") if [ $ora -ge 0 -a $ora -lt 12 ] then salut="Buna dimineata, $USER" elif [ $ora -ge 12 -a $ora -lt 18 ] then salut="Buna ziua, $USER" else salut="Buna seara, $USER" fi echo $salut Pb 22 script pentru preluarea unui numar si returnarea numarului scris in litere $ vi pb22.sh #!/bin/bash echo -n "Introdu numarul : " read n l=$(echo $n | wc -c) l=$(( $l - 1 )) echo "Numarul $n in cuvinte : " for (( i=1; i<=$l; i++ )) do cifra=$(echo $n | cut -c $i) case $cifra in 0) echo -n "zero " ;; 1) echo -n "unu " ;; 2) echo -n "doi " ;; 3) echo -n "trei " ;; 4) echo -n "patru " ;; 5) echo -n "cinci " ;; 6) echo -n "sase" ;;

7) echo -n "sapte " ;; 8) echo -n "opt " ;; 9) echo -n "noua " ;; esac done

Pb 23 Calculul numarului de cifre ale numar introdus de la tastatura $ vi pb23.sh #!/bin/bash echo -n "Introdu numarul : " read n sd=0 nd=0 on=$n while [ $n -gt 0 ] do sd=$(( $n % 10 )) n=$(( $n / 10 )) nd=$(( $nd + 1)) done echo "Numarul de cifre ale numarului $on este $nd"

Shell script debbuging #!/bin/sh -vx echo "Nume script echo "Primul argument echo "Al doilea argument echo "PID echo "Numar argumente echo "Toate argumentele echo "Flag-urile [$0]" [$1]" [$2]" [$$]" [$#]" [$@]" [$-]"

Dupa executie pe ecran obtinem:

In mod normal simbolul # anunta un comentariu dar daca il regasim pe prima linie semnificatia este de citire a caii catre shell-ul specificat si a flag-urilor optional precizate. Flag-ul v seteaza modul verbose si ne ajuta sa observam erorile de sintaxa deoarece se opreste afisarea acolo unde intalneste o astfel de eroare. Deasemenea realizeaza substitutia variabilelor cu valorile inregistrate de acestea pe parcursul executiei ceea ce ajuta foarte mult in cazul utilizarii instructiunii if sau a altor constructii complexe. Flag-ul -x este similar dar plaseaza suplimentar semnul + in fata fiecarei comenzi sau instructiuni executate. Daca scriptul contine o instructiune if care este evaluata ca adevarata semnul + va fi plasat in fata instructii if iar daca este evaluata ca falsa semnul + va fI plasat in fata instructiunii else. Daca verificam o structura ciclica -v va afisa intreaga constructie in timp ce x va identifica rezultatul executiei la pas cu pas. O alta metoda de utilizare a acestor 2 flag-uri este din linia de comanda astfel: bin/sh -xv nume_script arg_1 arg_2] Daca dorim sa testam numai o sectiune de cod putem utiliza comanda set astfel: #!/bin/sh echo "Nume script echo "Primul argument echo "Al doilea argument echo "start sectiune cu problema" set -v on set -x on echo "PID set -v off set -x off echo "stop sectiune cu problema" Dupa executie pe ecran obtinem: [$0]" [$1]" [$2]"

[$$]"

Intrarea in debug mode sau iesirea din acesta se poate preciza si astfel: #!/bin/bash clear set -x for f in * do file $f done set +x ls Un alt flag utilizat frecvent este n care forteaza shell-ul sa evite executia unor sectiuni de cod.Totusi va afisa erori de sintaxa prin mesaje unexpected end of file. Alte falg-uri mai putin utilizate sunt: -u, -t, -e, --. Exemple de posibile mesaje de eroare si semnificatia lor: Mesaje de eroare unexpected end of file at nnn test expected badly formed if missing test syntax error invalid number bad number Semnificatie Incadrare eronata in ghilimele sau grupare eronata pentru o constructie complexa Lipsa de spatiu pentru [ sau ] sau lipseste then Lipseste then sau fi Lipseste do pentru while sau for Incercare de comparare caracter alfanumeric cu un numar in comanda test Un sir utilizat in expr sau bc contine caractere alfanumerice Un numar real este utilizat expr (se utilizeaza doar intregi)

In cazul in care avem nevoie de o iesire fortata din executia script-ului datorita unei bucle infinite sau etc. utilizam: ps -ef | grep nume_script pentru identificarea PID si apoi kill -9 PID pentru stoparea executiei procesului. Utilizarea functiei debug Se declara la inceputul scriptului dupa care se utilizeaza. #!/bin/bash _DEBUG="on" function DEBUG() { [ "$_DEBUG" == "on" ] && $@ || : } DEBUG echo "Citire fisiere" for i in * do grep 'echo' $i > /dev/null [ $? -eq 0 ] && echo "Identificat in $i " || : done DEBUG set -x a=2 b=3 c=$(( $a + $b )) DEBUG set +x echo "$a + $b = $c"

Rezultat executie

#!/bin/bash _DEBUG="off" function DEBUG() { [ "$_DEBUG" == "on" ] && $@ || : } DEBUG echo "Citire fisiere" for i in * do grep 'echo' $i > /dev/null [ $? -eq 0 ] && echo "Identificat in $i " || : done

DEBUG set -x a=2 b=3 c=$(( $a + $b )) DEBUG set +x echo "$a + $b = $c"

Rezultat executie

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