Comenzi Unix Shell [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

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 Inodului. 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 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 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 inumber- 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 contine fisierele cu numele . si .. care identifica inodul 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 stud1…6

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

Sau conectare prin Secure Shell Client

Date de conectare suplimentare : Masina Ubuntu: fenrir.ase.ro Port 22 User: student1, student2,…student20 Passwd: student1, student2,…student20 Maşina AIX : sys.ase.ro Port 22 User: stud1…stud6 Passwd: std1…std6

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 – opreşte afişarea textului pe ecran Ctrl-q – reia afişarea textului pe ecran (oprită cu Ctrl-s) Ctrl-c – întrerupe activitatea curentă şi se foloseşte de regulă pentru a opri procese sau afişări pe ecran. Ctrl-d – semnifică sfârşitul fişierului sau ieşire, fiind utilizat pentru a ieşi din unele utilitare Unix, ieşirea 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 executăm. Ctrl-w – şterge ultimul cuvânt introdus la linia de comandă Ctrl-h – şterge ultimul caracter introdus la linia de comandă, fiind folosit atunci când tasta nu funcţionează 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 ''. 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. -w pentru numararea cuvintelor; 2. -c pentru a numara bytes; 3. -l pentru numararea liniilor; 4. -m numara caracterele utilizate 5. -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 5. –n 6. –l

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

Exemple :

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] apara [a-c] .

Explicatie Exact acest string: “abc” Unul dintre aceste caractere: “a”, “b” sau “c” Niciunul dintre aceste caractere nu trebuie sa 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 • 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 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 .

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

Utilizarea comenzii mv pentru mutarea unor fisiere din dintr-un subdirector in directorul parinte al acestuia.

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 intrun 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

• •

sintaxa:chmod (drepturi) (fisier) explicatii:Comanda poate fi utilizata doar de proprietarul fisierului, precizarea drepturilor 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;

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 – opreşte un proces în curs de execuţie kill -9 PID_proces 2. nice funcţia: lansează un proces cu prioritate redusă. Prioritatea este un număr. O prioritate mare înseamnă un număr mic. Administratorul poate lansa procese cu prioritate negativă. Priorităţile utilizate cu această comandă trebuie să fie până 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 execuţie şi ca atare se lansează în background. 3. at funcţia: lansează în execuţie un fişier de comenzi Shell la un moment de timp specificat sintaxa: at timp [data] [fişier] at 17 jan2 prog.sh - pe 2 ian. ora 17

4. atq funcţia: afişează procesele lansate în execuţie utilizând comanda at (cele care încă nu s-au lansat sau care se află în coada de aşteptare)

5. atrm funcţia: şterge procesele lansate în execuţie utilizând comanda at (cele care încă nu s-au lansat sau care se află în coada de aşteptare). Opţiunea –a se utilizează dacă doriţi să ştergeţi toate task-urile iar opţiunea -i dacă doriţi confirmare la ştergerea task-urilor planificate.

6. ps funcţia: oferă informaţii despre procesele active. Indică PID sau identificatorul procesului, PPID sau identificatorul procesului părinte, TT terminalul de control al procesului, STAT starea procesului(starea execuţiei, dacă imaginea procesului se află în memorie, prioritatea procesului), TIME durata procesului. Procesul poate fi în execuţie(r), în aşteptare(w), suspendat(s), oprit(t), terminat(y) sau inexistent(o).

infinita

ps -ef | grep nume_script – identifica PID-ul procesului ce ruleaza in bucla ps –ef afiseaza toate procesele in curs de executie ps -a afişează toate procesele asociate cu terminalul

ps -l afişează toate informaţiile despre procese

7. sh - lansează în execuţie interpretorul Shell 8. sleep - suspendă temporar execuţia unui proces 9. time - furnizează timpul de execuţie a unei comenzi

Pentru a gestiona mai uşor fişierele şi directoarele puteţi 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 sfârsitul unei expresii regulate marcheaza un sfârsit 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 oricâte 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 pâna 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 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] [+poziţionare] [fişier] unde: -r Încarcă ultima versiune salvată înainte de căderea sistemului. -R Se interzice modificarea conţinutului fişierului. Dacă se specifică poziţionare cursorul se poziţionează pe linia specificată (+nr_linie) sau pe şirul căutat (+/sir_căutat). 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 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 determina intoarcerea in modul comanda. Comenzile de introducere sunt date fara a se apasa dupa ele tasta ; 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 sau a tastei 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 ne plaseaza mereu in modul comanda, de aceea putem utiliza tasta 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 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 w b $ 0 sau ^ Tasta

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

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

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

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 shellscript-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

Editaţi fişierul de mai sus utilizând editorul mcedit şi editorul joe.

În cadrul editorului joe amintim combinaţiile de taste (comenzi) permise, ca:            

Ctrl Ctrl Ctrl Ctrl Ctrl Ctrl Ctrl Ctrl Ctrl Ctrl Ctrl Ctrl

– – – – – – – – – – – –

Z salt la cuvântul precedent X salt la următorul cuvânt K F căutare în text L continuarea căutării K L salt la o anumită linie K B marchează începutul blocului K K marchează sfârşitul blocului K M mută conţinutul blocului K C face o copie a conţinutului blocului K Y şterge conţinutul blocului Y şterge linia curentă K X paraseşte editorul salvând fişierul.

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 este director? • -f este fisier obisnuit? • -r poate fi citit? • -s are lungime diferita de 0? • -w poate fi modificat? • -x 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: • • • •

este sirul nenul? -n are sirul lungimea diferita de 0? -z are sirul lungimea 0? = sirurile sunt identice?



!= sirurile sunt diferite?

Exemple: $sir1 =dan $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 $?

Pentru tipul integer: • -eq int1=int2 • -ge int1>= int2 • -gt int1> int2 • -le int1temp $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 Efect special \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 informaţiilor 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

done

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

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 3.

comanda $chmod +x fis_exe 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 $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 /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

Comenzi pentru lucru cu fisiere si directoare bzip2, bunzip2 Very high quality file compression and decompression. chgrp

Change the group of files and directories.

chmod

Change the permissions (mode) of files and directories.

chown

Change the owner of files and directories.

cksum

Print a file checksum, POSIX standard algorithm.

comm

Print or omit lines that are unique or common between two sorted files.

cp

Copy files and directories.

df

Show free disk space.

diff

Compare files, showing differences.

du

Show disk block usage of files and directories.

file

Guess the type of data in a file by examining the first part of it.

find

Descend one or more directory hierarchies finding filesystem objects (files, directories, special files) that match specified criteria.

gzip, gunzip

High-quality file compression and decompression.

head

Print the first n lines of one or more files.

locate

Find a file somewhere on the system based on its name. The program uses a database of files that is usually rebuilt automatically, nightly.

ls

List files. Options control the information shown.

md5sum

Print a file checksum using the Message Digest 5 (MD5) algorithm.

mkdir

Make directories.

mktemp

Create a unique temporary file and print its name. Not universally available.

od

Octal dump; print file contents in octal, hexadecimal, or as character data.

patch

Update the contents of a given file to a newer version by reading the output of diff.

pwd

Print the current working directory. Usually built into modern shells.

rm

Remove files and directories.

rmdir

Remove just empty directories.

strings

Search binary files for printable strings and print them.

tail

Show the last n lines of a file. With -f, keep printing the (growing) contents of the file.

tar

Tape archiver. Now used mostly as a software distribution format.

touch

Update the modification or access time of a file.

umask

Set the default file-creation permissions mask.

zip, unzip

File archiver and compressor/decompressor. The ZIP format is portable across a broad range of operating systems.

Comenzi pentru gestiunea proceselor at

Executes jobs at a specified time. at schedules jobs to be executed just once, whereas cron schedules them to be executed regularly.

batch

Executes jobs when the system is not too overloaded.

cron

Executes jobs at specified times.

crontab Edit per-user "cron table" files that specify what commands to run, and when. fuser

Find processes using particular files or sockets.

kill

Send a signal to one or more processes.

nice

Change the priority of a process before starting it.

ps

Process status. Print information about running processes.

renice

Change the priority of a process that has already been started.

sleep

Stop execution for the given number of seconds.

top

Interactively display the most CPU-intensive jobs on the system.

wait

Shell built-in command to wait for one or more processes to complete.

xargs

Read strings on standard input, passing as many as possible as arguments to a given command. Most often used together with find.

Comenzi pentru procesarea textelor awk

An elegant and useful programming language in its own right, it is also an important component of many large shell scripts.

cat

Concatenate files.

cmp

Simple file comparison program.

cut

Cut out selected columns or fields.

dd

A more specialized program for blocking and unblocking data, and converting between ASCII and EBCDIC. dd is especially good for making raw copies of device files. Note that iconv is a better program for doing character set conversions.

echo

Print arguments to standard output.

egrep

Extended grep. Matching uses Extended Regular Expressions (EREs).

expand

Expand tabs to spaces.

fgrep

Fast grep. This program uses a different algorithm than grep for matching

fixed strings. Most, but not all, Unix systems can search simultaneously for multiple fixed strings. fmt

Simple tool for formatting text into paragraphs.

grep

From the original ed line editor's command g/re/p, "Globally match RE and Print." Matching uses Basic Regular Expressions (BREs).

iconv

General-purpose character-encoding conversion tool.

join

Join matching records from multiple files.

less

A sophisticated interactive pager program for looking at information on a terminal, one screenful (or "page") at a time. It is now available from the GNU Project. The name is a pun on the moreprogram.

more

The original BSD Unix interactive pager program.

pr

Format files for printing on line printers.

printf

A more sophisticated version of echo that provides control over the way each argument is printed.

sed

A stream editor, based on the original ed line editor's command set.

sort

Sort text files. Command-line arguments provide control over sort key specification and priority.

spell

A batch spellchecker. You may have aspell or ispell, with a shell script wrapper named spell, instead.

tee

Copy standard input to standard output and to one or more named output files.

tr

Transliterate, delete, or reduce runs of duplicate characters.

unexpand Convert runs of spaces into the appropriate number of tabs. uniq

Remove or count duplicate lines in sorted input.

wc

Count lines, words, characters, and/or bytes.

Exemple de scripturi 1. #!/bin/sh # Verificarea conectarii unui utilizator - varianta aproximativa if test $# -eq 1 then if who | grep -q "$1" then echo "$1 este conectat" else echo "$1 nu este conectat" fi else echo "$0 user" fi 2. #!/bin/sh # Verificarea conectarii unui utilizator - varianta corectata if test $# -eq 1 then f=1 for u in `who | cut -d ' ' -f 1` do if test "$u" = "$1" then f=0 fi done if test "$f" -eq 0 then echo "$1 este conectat" else echo "$1 nu este conectat" fi else echo "$0 user" fi 3. #!/bin/sh # Eliminarea liniilor vide dintr-un fisier - varianta iterativa

if test $# -eq 1 then cat "$1" | while read l do if test ! -z "$l" then echo "$l" >> "$1.tmp" fi done if test -f "$1.tmp" then mv "$1.tmp" "$1" fi else echo "$0 file" fi 4. #!/bin/sh # Eliminarea liniilor vide dintr-un fisier - varianta declarativa if test $# -eq 1 then sed '/^$/d' < "$1" > "$1" else echo "$0 file" fi 5. #!/bin/sh # Verificarea validitatii unei adrese de e-mail if test $# -eq 1 then if echo "$1" | egrep '^([a-zA-Z0-9]+[.|_]?)+@([a-zA-Z0-9]+[.|_]?)+.[ro|hu]$' then echo "Valida" else echo "Invalida" fi else echo "$0 email" fi 6. #!/bin/sh # Preprocesarea directivelor #include if test $# -eq 1 then cat "$1" | while read l do if echo "$l" | egrep -q '#include "[a-zA-Z0-9]+.h"' then f=`echo "$1" | sed 's/#include "\([a-zA-Z0-9]\+.h\)"/\1/'` if test -f "$f"

then cat "$f" >> "__$1" fi else echo "$l" >> "__$1" fi done else echo "$0 file" fi 7. #!/bin/sh # Afiseaza modificarile continutului unui director while [ $# -gt 0 ] do case "$1" in "-d")shift dir="$1" shift ;; "-s")shift s="$1" shift ;; "-c")shift c="$1" shift ;; "*")shift ;; esac done if [ ! -z "$dir" ] then dir="$dir/" fi if [ ! -z "$s" ] then ls -A > "$dir$s" elif [ ! -z "$c" ] then ls -A > "/tmp/$c.tmp" for file in `diff "$dir$c" "/tmp/$c.tmp" | cut -f 2 -d ' '` do if [ -e "$file" ] then echo "$file"

fi done rm "/tmp/$c.tmp" else echo "Usage: $0 {-s files.lst | -c files.lst } [ -d directory ]" fi 8. #!/bin/sh # Termina executia tuturor proceselor ruland acelasi fisier if test $# -eq 1 then p=`which "$1"` if test -z "$p" then p="$1" fi ps ax | while read l do s=`echo "$l" | cut -d ' ' -f 7` if test \( "$s" = "$1" \) -o \( "$s" = "$p" \) then i=`echo "$l" | cut -d ' ' -f 1` kill -9 "$i" > /dev/null fi done else echo "Usage: $0 file" fi 9. #!/bin/sh # Afiseaza calea absoluta catre un fisier if test $# -eq 1 then f=0 i=1 d=`echo $PATH | cut -d ':' -f $i` while test \( $f -eq 0 \) -a \( ! -z "$d" \) do if test -f "$d/$1" then echo "$d/$1" f=1 else i=`expr $i + 1` d=`echo $PATH | cut -d ':' -f $i` fi done if test $f -eq 0

then echo "File $1 not found in $PATH" fi else echo "Usage: $0 file" fi 10. #!/bin/sh # Afiseaza dimensiunea totala a fisierelor dintr-un # director dat avand un anumit utilizator proprietar while test $# -gt 0 do case "$1" in "-d")shift d="$1" shift ;; "-u")shift u="$1" shift ;; "*")shift ;; esac done if test \( ! -z "$d" \) -a \( ! -z "$u" \) then if test -d "$d" then t=0 ls -Al "$d" | while read l do f=`echo $l | cut -d ' ' -f 9` o=`echo $l | cut -d ' ' -f 3` if test \( -f "$f" \) -a \( "$o" = "$u" \) then s=`wc -c "$d/$f" | cut -d ' ' -f 1` t=`expr $t + $s` fi done echo "Total file size in $d owned by $u is $t" else echo "Directory $d not found" fi else echo "Usage: $0 -d -u " fi

11. #!/bin/sh # Revoca dreptul de executie tuturor asupra fisierelor # dintr-un director dat avand ca proprietar un anumit utilizator while test $# -gt 0 do case "$1" in "-d")shift d="$1" shift ;; "-u")shift u="$1" ;; "*")shift ;; esac done if test \( ! -z "$d" \) -a \( ! -z "$u" \) then if test -d "$d" then t=0 ls -Al "$d" | while read l do f=`echo $l | cut -d ' ' -f 9` o=`echo $l | cut -d ' ' -f 3` if test \( -f "$f" \) -a \( "$o" = "$u" \) then chmod a-x "$d/$f" fi done echo "Total file size in $d owned by $u is $t" else echo "Directory $d not found" fi else echo "Usage: $0 -d -u " fi 12. #!/bin/sh # Revoca dreptul de executie tuturor asupra fisierelor # dintr-un director dat si subdirectoarele acestuia # avand ca proprietar un anumit utilizator while test $# -gt 0 do case "$1" in "-d")shift

d="$1" shift ;; "-u")shift u="$1" shift ;; "*")shift ;; esac done if test \( ! -z "$d" \) -a \( ! -z "$u" \) then if test -d "$d" then ls -RA "$d" "*.sh" | while read l do case "$l" in "./*:") d=`echo "$l" | sed s/^\.\/\(\[^:]+\):$/\1/g` ;; "*")o=`echo "$l" | cut -d ' ' -f 3` f=`echo "$l" | cut -d ' ' -f 9` if test -f "$d/$f" then chmod a-x "$d/$f" fi ;; esac done else echo "Diretory $d not found" fi else echo "Usage: $0 -d -u " fi 13. #!/bin/sh # Redenumeste in secventa fisierele cu o anumita extensie while test $# -gt 0 do case "$1" in "-d")shift d="$1" shift ;; "-n")shift

n="$1" shift ;; "-e")shift e="$1" shift ;; "-s")shift s="$1" shift ;; "-l")shift l="$1" shift ;; "*")shift ;; esac done if test \( ! -z "$d" \) -a \( ! -z "$n" \) -a \( ! -z "$e" \) then if test -d "$d" then if test -z "$s" then s=1 fi if test -z "$l" then l=4 fi i="$s" ls -A "$d" "*.$e" | while read f do if test -f "$f" then t="" j=${#i} while test ${#t} -lt "$l" do t="0$t" done mv "$d/$f" "$d/$t$n.$e" i=`expr "$i" + 1` fi done

i=`expr "$i" - "$s"` echo "There were $i files renamed as $n. $e" else echo "Directory $d not found" fi else echo "Usage: $0 -n -e [-s ] [-l ]" fi 14. #!/bin/sh # Utilitar de mail-merge while test $# -gt 0 do case "$1" in "-t")shift $t="$1" shift ;; "-s")shift $s="$1" shift ;; "-u")shift $u="$1" shift ;; "*")shift ;; esac done if test \( ! -z "$t" \) -a \( ! -z "$s" \) -a \( ! -z "$u" \) then if test \( -f "$t" \) -a \( -f "$u" \) then $t=`cat "$t"` cat "$u" | while read l do m="$t" $d=`echo "$l" | cut -d ' ' -f 1` i=2 f=`echo "$l" | cut -d ' ' -f "$i"` while test ! -z "$f" do m=`echo "$m" | sed 's/\{"$i"\}/"$f"/g'` i=`expr "$i" + 1` f=`echo "$l" | cut -d ' ' -f "$i"`

done echo "$m" | mail -s "$s" "$d" done else "Input file not found" fi else echo "Usage: $0 -t