Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Linux


Index » educatie » » informatica » Linux
» Introducere in UNIX: caracteristici, principii, istoric


Introducere in UNIX: caracteristici, principii, istoric


Modul 1: Introducere in UNIX: caracteristici, principii, istoric

Introducere

Scopul acestui curs este familiarizarea cu sistemul de operare UNIX, dar si cu resurse care sa permita studiul mai in detaliu a unor aspecte ce tin de administrare, aplicatii distribuite.

Daca in cea mai mare parte a cursului, prezentarea se va face pentru UNIX System V Release 4, vor fi aduse referiri si asupra altor sisteme de operare bazate pe UNIX.



In acest prim modul vom discuta despre caracteristicile, principiile si istoricul SO UNIX, vom incerca sa aflam ce anume l-a facut atat de popular.

Dezvoltat in anii '70 la compania AT&T si Universitatea Berkeley, UNIX a devenit un sistem de operare foarte raspandit in intreaga lume, atat in educatie si cercetare, cat si in administratie si industrie. UNIX a fost si ramane SO preferat pentru lucrul in retea, in special pentru serverele de retea.

Exista multe variante de UNIX: System V, BSD, XENIX, AT&T, SCO, AIX, Linux, UNIXWare, Solaris, IRIX, s.a., intrucat multe companii/universitati si-au dezvoltat propria varianta de UNIX, nereusindu-se impunerea unui standard unic - prezentare variante. Pentru aceste variante exista anumite diferente de implementare si exploatare, dar principiile utilizate sunt aceleasi, astfel incat pentru utilizatorul obisnuit, accesul si exploatarea sunt aproape similare.

Caracteristici SO UNIX

Caracteristici

UNIX este denumirea generica a unei largi familii de sisteme de operare:

portabile

orientate pe comenzi

multiuser si

multitasking.

Sa lamurim termenii enumerati:

sistem de operare - SO: sistem de programe de baza care realizeaza controlul si managementul resurselor calculatorului, oferind si un set de servicii utilizatorului. Functiile realizate de SO cuprind:

planificarea, incarcarea, initializarea si supervizarea executiei programelor

alocarea memoriei

initializarea si controlul operatiilor de I/E

tratarea erorilor.

SO portabil: poate fi transferat usor de la un tip de calculator la altul

SO orientat pe comenzi: sistemul dispune de un interpretor de comenzi, care preia comenzile introduse de utilizator, le executa si afiseaza rezultatele obtinute.

SO multiutilizator: sistemul permite crearea de conturi utilizator; utilizatorii se pot conecta si lucra simultan, au anumite drepturi si restrictii de acces la fisiere si la celelalte resurse ale sistemului, impuse prin mecanisme de protectie.

SO multitasking: pe un astfel de sistem se executa simultan mai multe programe, numite procese ( taskuri ). Multitaskingul se realizeaza prin mecanismul de time-sharing in cazul calculatoarelor monoprocesor: UC este alocata proceselor conform unei politici de planificare, care poate fi: round-robin, bazata pe prioritati statice sau dinamice, ultima fiind cea utilizata in cazul UNIX. Concurenta proceselor nu este deci un paralelism real, cum exista in cazul sistemelor multiprocesor sau distribuite, in care procesele se executa pe procesoare diferite, in paralel, comunicand prin memorii comune sau canale de comunicatie.

UNIX este deci un SO multiuser si multitasking, pe cand Windows este monouser si multitasking; daca ne referim la SO de retea, cum sunt Novell sau Windows NT, acestea sunt multiuser si multitasking

Principii

Principiile pe care s-a dezvoltat SO UNIX sunt enumerate mai jos:

modularitate

operatiile de I/E sunt integrate in sistemul de fisiere, realizandu-se asa-numitele I/E generalizate

exista un sistem de gestiune a proceselor reentrante si asincrone multiple, care se pot sincroniza prin intermediul unui sistem de intreruperi logice

gestiunea memoriei se face printr-un mecanism care permite schimbul de pagini intre memoria RAM si cea externa

interfata simpla prin componenta shell, care nu este integrata in kernel

sistem deschis - componente portabile, fiind scrise in C

intretinere si dezvoltare simple.

Filozofia UNIX

Se poate vorbi de o filozofie UNIX, influentata de structura sistemului si de modul in care lucreaza. Filozofia UNIX este bazata pe ideea ca un sistem de calcul complex si puternic trebuie sa ramana simplu, general, extensibil, cu beneficii atat pentru programatori, cat si pentru utilizatori - small is beautiful, spun autorii UNIX

Istoricul sistemului de operare UNIX

UNIX System V

Istoria UNIX incepe la Bell Laboratories in 1969, cand Ken Thompson impreuna cu un colectiv de cercetatori pe care ii coordona, au dezvoltat un sistem numit la inceput Unics - Uniplexed Information and Computing System, implementat pe minicalculatoare DEC PDP-7, caracterizat prin: sistem de fisiere, multiuser ( 2 utilizatori ), multitasking, cu gestiunea perifericelor transparenta pentru utilizator si scris in limbaj de asamblare si Fortran.

Thompson continua astfel cercetarile incepute cu cativa inainte la proiectul Multics - Multiplexed Information and Computing System, comun MIT, AT&T Bell Labs si General Electric, la care un aspect important ce fusese urmarit era securitatea, dar care a fost abandonat.

Prima documentatie despre UNIX este scrisa in 1971.

Dupa aparitia in 1972 a limbajului C, creat de Dennis Ritchie de la Bell Laboratories, UNIX-ul este rescris in C, de Ritchie si Thompson, devenind multitasking.

In 1973, apare o versiune portabila. Aceasta este prima versiune care este facuta cunoscuta in afara Bell Labs si este distribuita gratuit universitatilor americane si sub licenta, guvernului SUA si firmelor.

In 1974, Ritchie si Thompson publica articolul 'The UNIX Time-Sharing System' in Communication of the ACM, spunand ca UNIX este 'a small and yet powerful operating system'.

SO UNIX, compilatorul C si in esenta toate aplicatiile sub UNIX sunt scrise intr-o proportie mare in C. Din cele 13000 linii sursa ale sistemului UNIX, numai 800 linii au fost scrise in limbaj de asamblare, restul fiind scrise in C. De asemenea, compilatorul C este scris in C in proportie de 80%. In felul acesta limbajul C asigura o portabilitate buna pentru programele scrise in el.

Portabilitatea mare a programelor scrise in C a condus la o raspandire destul de rapida a limbajului C si a sistemului de operare UNIX: se scria in asamblare doar un mic nucleu de legatura cu hardware-ul unui anumit tip de calculator, iar restul sistemului UNIX era scris in C, fiind acelasi pentru toate tipurile de calculatoare; mai era
nevoie de un compilator de C pentru acel calculator si astfel se putea compila si instala UNIX-ul pe acel calculator.

Anul 1975 inregistreaza aparitia versiunilor 4, 5, 6, care definesc pipes, in 1978 fiind 600 de calculatoare ce rulau UNIX.

Ultima versiune de cercetare, 7 din 1978, implementata pe un DEC PDP-11, are nucleul independent de hardware si devine prima versiune comercializata.

In 1982 este elaborat UNIX System III pentru calculatoarele VAX 11/780, iar in 1983 UNIX System V.

In 1980-1981 apar primele licente: ULTRIX ( firma DEC ), XENIX ( Microsoft ), UTS ( Amdahl ), etc.

BSD UNIX

Versiunea 7 a servit drept punct de plecare pentru toate dezvoltarile ulterioare ale sistemului. Plecand de la aceasta versiune, s-au nascut doua mari directii de dezvoltare:

1.dezvoltarile realizate la compania AT&T, proprietara Bell Laboratories, au condus la versiunile succesive de System V UNIX;
2.cercetarile de la Universitatea Berkeley s-a concretizat in versiunile succesive de BSD UNIX ( Berkeley Software Distribution ).

O explicatie a acestor doua directii? Anul 1976 fusese an sabatic pentru Thompson, petrecut la Berkeley, unde instaleaza UNIX versiunea 6; printre studentii de atunci s-a aflat Bill Joy, cofondator Sun in 1982, care contribuie ulterior la dezvoltarea BSD UNIX.

Versiunile BSD au introdus noi concepte, cum ar fi: memoria virtuala ( BSD 4.1 ), facilitati de retea TCP/IP ( BSD 4.2 ), fast file system, schimb de informatii intre procese centralizat sau distribuit.

Versiunile System V au introdus drept concepte noi: semafoare, blocaje, cozi de mesaje, memorie virtuala, memorie pe 8 biti.

Pe langa aceste variante majore, au fost dezvoltate si alte variante de UNIX, plecand de la nucleul ( kernel-ul ) UNIX al firmei AT&T, si anume: XENIX de catre firma Microsoft, VENIX de catre firma Venturecom, UNIX SCO, AIX de catre IBM.

Variante UNIX

Pe langa aceste variante, au fost dezvoltate si sisteme ne-AT&T: MINIX de catre Andrew Tanenbaum, LINUX de catre Linus Torvald, XINU de catre Douglas Comer, GNU de catre FSF ( Free Software Fundation ).

MINIX a fost construit la Vrije Universiteit Amnsterdam de colectivul profesorului Andrew Tanenbaum, avand aceleasi comenzi si apeluri sistem ca UNIX, dar cu proiectare si implementare proprii; cele 12000 linii C si asamblare I8086 ale sistemului erau disponibile oricui voia sa studieze functionarea unui SO.

Pornind de la MINIX, un student din Finlanda, Linus Torvalds a creat un sistem mai complex, numit Linux, facut public in 1991. Evolutia Linux a fost spectaculoasa - vezi istoric Linux, fiind considerat un rival Windows si sprijinit de multe firme mari ca: IBM, Borland, Corel, Oracle. Exista firme ce distribuie licente Linux la preturi mici ca RedHat, SuSE, Caldera sau distribuitii gratuite bazate pe varianta BSD - FreeBSD.

GNU ( de la GNU's Not UNIX ) este proiectul fundatiei FSF, lansat in 1983 de Richard Stallman; are ca scop dezvoltarea unui sistem in intregime compatibil cu cel de la AT&T, care sa nu necesite nici o licenta de utilizare. Actuala versiune GNU este bazata pe kernel-ul Linux, numinadu-se GNU/Linux.

Aceasta multiplicare a versiunilor de UNIX, devenite incompatibile si facand dificila portarea aplicatiilor, a determinat utilizatorii de UNIX sa se regrupeze si sa propuna definirea de interfete standard: X/OPEN si POSIX ( Standard IEEE Portable Operating System Interface for Computer Environments ). Aceste interfete au preluat in mare parte propunerile facute in definitia de interfata SVID ( System V Interface Definition ) propusa de AT&T, dar influentele din celelalte variante nu sunt neglijabile.

Normalizarea sistemului este doar la nivel utilizator, nefiind vorba de o unicitate a nucleului; cele doua blocuri formate, UNIX International ( AT&T si Sun ) si OSF ( Open Software Foundation ) continua sa-si dezvolte separat propriul nucleu, dar totusi diferentele de implementare sunt transparente pentru utilizatori.

O alta frana pentru raspandirea sistemului UNIX, pe langa aceasta lipsa de normalizare, a constituit-o aspectul neprietenos al interfetei utilizator, care a ramas pentru multa vreme orientata spre utilizarea de terminale alfanumerice, deci mod text, nu grafic. Dar si pe acest plan situatia s-a imbunatatit considerabil, prin adoptarea
protocolului X-Windows - interfata utilizator grafica si dezvoltarea de medii grafice bazate pe acest protocol.

Sistemul X a fost dezvoltat in cadrul proiectului Athena de la MIT. Majoritatea statiilor de lucru aflate actual pe piata poseda acest sistem. Protocolul X a fost conceput pe ideea distribuirii calculelor intre diferitele unitati centrale, statii de lucru a utilizatorilor si celelalte masini din retea pe care se executa procesele utilizatorilor. Protocolul X a fost adoptat ca standard si s-au dezvoltat o serie de biblioteci grafice, toate avand ca substrat biblioteca de baza X-Windows, precum ar fi: MOTIF, OPEN LOOK, etc.

Punctul de vedere al cercetatorilor si dezvoltatorilor din domeniul evolutiei sistemelor si a UNIX-ului in particular, referitor la dezvoltarea unui sistem distribuit fizic pe mai multe calculatoare, a evoluat de la imaginea unui sistem format din unitati separate si independente, avand fiecare propriul sau sistem de exploatare si care pot comunica cu sistemele de exploatare de pe celelalte masini din sistem (acesta este cazul actual al statiilor UNIX dintr-o retea), la imaginea unui ansamblu de resurse a caror localizare devine transparenta pentru utilizator.

In acest sens, protocolul NFS ( Network File System ), propus de firma SUN Microsystems, a fost, cu toate incovenientele si imperfectiunile sale, prima incercare de realizare a unui astfel de sistem care a fost integrata in sistemele UNIX comercializate.

In ultimii ani, cercetarea s-a focalizat pe tehnologia micronucleu, pentru reproiectarea nucleului UNIX. Aceasta pentru ca includerea facilitatilor de lucru in retea si pentru interfata grafica au dus la cresterea dimensiunilor sistemului, care initial era suficient de mic pentru a putea fi cunoscut in detaliu de o singura persoana

Modul 2: Structura SO UNIX. Sistemul de fisiere. Prima sesiune de lucru, primele comenzi

2.1 Structura SO UNIX

Dupa cum am precizat in modulul anterior, UNIX-ul este un SO scris pentru programatori si utilizatori.

Pe langa gestionarea resurselor calculatorului, UNIX-ul pune la dispozitie un numar foarte mare de utilitare/aplicatii.

Structura unui sistem UNIX se compune din:

nucleu ( kernel )

shell

comenzi si aplicatii utilizator.

Nucleul

Nucleul ( kernelul ) este partea de baza, rezidenta din SO care interactioneaza direct cu hardware-ul, prin intermediul unor drivere pentru dispozitivele fizice.

Functiile principale ale kernelului sunt:

gestionarea memoriei

gestionarea/planificarea accesului la resurse

gestionarea sistemului de fisiere

tratarea intreruperilor

tratarea erorilor

gestionarea operatiilor de I/E de nivel scazut.

Comenzile si aplicatiile interactioneaza cu kernelul prin apeluri sistem ( system calls ). Exista definite aproximativ 100 apeluri sistem, care realizeaza deschiderea/ citirea/ scrierea/ inchiderea fisierelor, executia/ terminarea unui proces, schimbarea prioritatii unui proces, etc.

De obicei programele care realizeaza apeluri sistem sunt scrise in C; de asemenea, cea mai mare parte a nucleului ( 90% ) este scrisa in C.

Shell

Shellul citeste, interpreteaza si executa comenzile, fiind deci interfata intre utilizator si kernell. Avand aceste functii, shellul se numeste si interpreter de comenzi. Exista mai multe tipuri de shell: C Shell, Bourne Shell, Korn Shell.

Shellul este in acelasi timp si un limbaj de programare, intrucat permit scrierea de programe ( sau scripturi ) shell - acestea vor constitui un capitol al cursului.

Utilitare

Sistemul UNIX contine cateva sute de utilitare sau programe utilizator.

Comenzile - exista peste 250 - sunt privite ca utilitare. Noi comenzi pot fi definite de utilizatori, iar ele vor fi tratate de shell la fel ca si comenzile existente in UNIX. Aceasta posibilitate de definire de noi comenzi este una dintre diferentele dintre UNIX si alte SO.

Comenzile UNIX se inscriu in categoriile:

de gestiune a proceselor

de manipulare a fisierelor

editoare de text

de comunicare intre utilizatori

compilatoare, depanatoare

programe pentru posta electronica si alte protocoale de acces Internet, etc.

Aplicatii complexe distribuite, Web, multimedia, pot fi realizate pornind de utilitarele, comenzile definite de SO.

O structura mai detaliata a SO UNIX poate fi reprezentata ca mai jos:

2.2 Sistemul de fisiere

Fisierele sunt parte integranta din UNIX. Un fisier este cea mai mica unitate in care informatia se memoreaza, o secventa de octeti servind unui scop comun.

Sistemul de fisiere se refera la activitatile de structurare, denumire, accesare, utilizare, protectie si implementare ale fisierelor, managementul fisierelor fiind una dintre sarcinile de baza ale SO.

In UNIX, fisierele pot fi fizice, virtuale sau distribuite.

Fisierele au o organizare ierarhizata, pe directoare ( cataloage ) formate la randul lor din fisiere si subdirectoare.

Vom reveni mai pe larg asupra sistemului de fisiere in modulul urmator.

2.3 Prima sesiune, primele comenzi

Am ajuns acum la momentul la care sa facem cunostinta efectiv cu SO UNIX ( UNIX-like, ditributie Linux ), la prima sesiune de lucru.

O sesiune de lucru incepe din momentul conectarii reusite la o masina UNIX, cand se lanseaza interpreterul de comenzi implicit, pana la comanda de iesire.

Pe ce sistem vom lucra?

Aici avem cinci variante:

lucrul pe o masina la distanta ( aflata la Timisoara ) - cu ssh;

instalarea unei distributii Linux - mai jos sunt date elementele necesare, pe care le vom discuta, detalia in Conferinta Software Consulting - Primele sesiuni de lucru;

cu CD Knoppix - poate fi ridicat de la Credis;

cu un emulator Linux - Cygwin

lucrul pe calculatoarele de la Credis - in orice zi a saptamanii laboratoarele va asteapta pentru a exersa comenzile, pentru a lucra la aplicatiile tema.

Lucrul cu ssh

Gasiti in fisierul conturi.txt, conturile pe care vi le-am deschis pentru a lucra pe serverul Timsoft, un server Linux Fedora.

Protocolul ssh transforma statia pe care lucrati intr-un terminal conectat, prin retea, la calculatorul pe care doriti sa lucrati - in cazul nostru dnt-gw-timsoft.dnttm.ro.

Descarcati aplicatia putty; dupa lansare, va conectati prin ssh la:

dnt-gw-timsoft.dnttm.ro

La

login:

introduceti informatiile contului personal, din conturi.txt

Comenzile telnet si ssh ( masi sigura decat telnet ) pot fi folosite si de pe un calculator UNIX pentru conectarea la un alt calculator UNIX. In cazul in care cele doua calculatoare au acelasi sistem UNIX, se poate folosi comanda rlogin.

Instalare Linux

O distributie Linux se refera la un sistem Linux ce cuprinde un program de instalare, nucleul si cateva aplicatii gata compilate. Informatii despre distributiile Linux se gasesc la LinuxISO.org.

Se apreciaza ca numarul utilizatorilor actuali de Linux este de 29 milioane - vezi Linux Counter.

Distributiile Linux cele mai cunoscute, unele putand fiind descarcate gratuit, altele contra unui cost relativ redus ca pachete CD-uri + manuale de utilizare:

Fedora / Red Hat - ghid instalare

SuSe

Debian

Mandrake

Slackware

Decebal

Knoppix - permite pornire directa de pe CD, nu mai e necesara instalarea; descarcare de la Roedu Iasi sau il ridicati de la Credis.

Fiecare dintre distribuitii are o comunitate de utilizatori, cu forumuri de discutii, unde se pot cere lamuriri despre instalare/utilizare, se gasesc documentatii.

Puteti de asemenea descarca si instala FreeBDS, o versiune UNIX.

Cateva comenzi

Dupa intrarea intr-o sesiune de lucru, se afiseaza prompterul interpreterului de comenzi, al shellului. UNIX este case sensitive, deci se face distinctie intre literele mari si mici.

Mai jos gasiti cateva comenzi dintre cele mai utile pe care va invit sa le incercati.

modificarea parolei:

passwd

afisarea continutului directorului curent:

ls

afisarea username-ului utilizatorului curent:

whoami

afisarea utilizatorilor care sunt in sesiune de lucru:

who

who -m

are acelasi efect ca whoami

who am i

ca mai sus; oricare doua argumente echivaleaza cu -m

afisarea utilizatorilor care sunt in sesiune de lucru si procesele lor active ( se poate deci vedea ce lucreaza fiecare ):

w

afisarea de informatii din manualul de referinta online al sistemului:

man

man comanda

sau

comanda --help

afisarea de informatii despre sesiunile de lucru ale tuturor utilizatorilor, respectiv ale utilizatorului specificat ( IP de unde s-a intrat, momentele intre care a durat sesiunea ); nu e greu de stiut astfel cat de harnici sunt utilizatorii din sistem, nu? :-)

last

last userid

iesire din sesiune:

logout

exit

CTRL/D

2.4 Alte resurse

UNIXGuide.net

Linux / Unix / Computing Glossary

Linux.org

2.5 Aplicatii

In Conferinta Software Consulting - Primele sesiuni de lucru, va rog sa confirmati/comentati:

corectitudinea contului pe serverul Timsoft si executia comenzilor de mai sus

daca instalati un emulator sau distributie Linux: scrieti ce versiune si eventualele probleme ce apar, pentru a le putea rezolva impreuna.

Modul 3: Sistemul de fisiere

Sistemul de fisiere

Structura generala de directoare

Alte informatii

Aplicatii

3.1 Sistemul de fisiere

Am vazut in modulul anterior ca sistemul de fisiere se refera la activitatile de structurare, denumire, accesare, utilizare, protectie si implementare ale fisierelor, managementul fisierelor fiind una dintre sarcinile de baza ale SO.

In UNIX, pot coexista mai multe sisteme de fisiere:

fizice - despre care vom vorbi in continuare

virtuale - pentru a realiza coexistenta mai multor sisteme de fisiere diferite, nucleul SO contine nivelul special numit sistem virtual de fisiere, cu rolul de a uniformiza accesul la fisiere

distribuite - pentru accesarea de fisiere stocate la distanta, pe alte calculatoare din retea.

Partitia

Sistemele fizice de fisiere sunt plasate intr-o zona a unui mediu de stocare ( de obicei disc magnetic ), numita partitie.

Fiecare disc poate fi impartit, din punct de vedere logic, in mai multe zone numite partitii, pe fiecare construindu-se cate un sistem de fisiere independent; fiecare partitie se comporta deci, la nivel utilizator, ca un disc de sine statator.

Pentru a putea fi utilizat, discul trebuie formatat, fiind impartit in blocuri.

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/ocupate din cadrul partitiei, despre fiecare fisier continut de acea partitie.

Daca in DOS partitiile sunt discuri logice cu numele: C:, D:, E:, s.a.m.d, in Unix ele sunt specificate prin fisiere speciale aflate in directorul /dev, care pentru folosire trebuie montate.

Sistemul de fisiere foloseste ca unitate de baza blocul de pe partitie; aceasta inseamna ca orice alocare se face la nivel de bloc, ceea ce simplifica gestiunea spatiului liber. Marimea unui bloc este un multiplu de 512 octeti, depinzand de implementarea sistemului.

Mai jos apare un sistem de fisiere pe o partitie si modul de organizare a blocurilor:

BB - blocul de boot contine programele care realizeaza incarcarea partii rezidente a sistemului de operare Unix; ocupa de obicei primul sector al discului

SB - super blocul contine informatii despre intreaga partitie, deci asupra modului cum sistemul de fisiere foloseste partitia:

o                    marimea si starea sistemului de fisiere: eticheta, numele sistemului de fisiere, marimea blocurilor, data si ora ultimei modificari a superblocului

o                    informatii despre la i-noduri: numar de i-noduri alocate/libere

o                    blocurile de memorie

IL - lista de i-noduri cuprinde informatii cu privire la fiecare i-nod din sistem; fiecare i-nod este caracterizat de un index;unul dintre i-noduri este radacina sistemului de fisiere, prin acesta fiind
disponibila structura de cataloage a sistemului de fisiere. i-node ( sau inode ) este prescurtarea de la Information Node.

DB - blocuri de date, care contin informatiile efective ale directoarelor si fisierelor

swap - mai poate exista si o zona de swap, rezervata pentru pastrarea imaginilor proceselor atunci cand sunt eliminate temporar din memorie pentru a face loc altor procese; de obicei pentru zona de swap se folosesc partitii distincte.

Tipuri de fisiere

Exista trei tipuri de fisiere fizice:

fisiere ordinare

fisiere director

fisiere speciale

Fisiere ordinare

Un fisier ordinar este folosit pentru memorare de informatii pe suport magnetic; pot fi text sau binare.

Intern fisierele nu au un nume, ci sunt identificate de un numar numit i-number, care reprezinta indexul unui sir de i-noduri.

Valoarea i-nodului se poate afla cu:

ls -i

Informatia din i-nod cuprinde:

identificatorul proprietarului fisierului - uid (user-id)

identificatorul de grup al utilizatorului

drepturile de acces la fisier; drepturile sunt de trei tipuri (r-read, w-write, x-execute) si sunt grupate pe trei categorii:

o                    user - drepturile proprietarului fisierului

o                    group - drepturile utilizatorilor din grupul proprietarului

o                    others - drepturile tuturor celorlalti utilizatori

timpul ultimului acces la fisier

timpul ultimei actualizari a fisierului

timpul ultimului acces pentru actualizarea nodului index

codul fisierului (tipul fisierului):

o                    fisiere obisnuite -

o                    directoare - d

o                    periferice - c

o                    legatura simbolica - l

o                    fisier special in mod bloc sau in mod caracter - b sau c

o                    fisier de tip fifo - p

o                    fisier de tip socket - s

lungimea fisierului (in octeti)

contorul de legaturi al fisierului: numarul de legaturi existente spre acest nod index

lista de blocuri care contin fisierul.

Toate informatiile de mai sus, cu exceptia listei de blocuri, se pot afla cu comanda

ls -l

; optiunea l ( long ) se refera la listarea tuturor informatiilor; pentru fisierele ascunse, adaugam si optiunea a:

ls -al

Pentru a indica ce blocuri compun un fisier se folosesc pointeri la blocuri; un pointer la un bloc este numarul de pe partitie al blocului.

Blocul 0 ( bloc de boot ) nu apartine nici unui fisier, exista deci posibilitatea de a indica si lipsa unui bloc.

Modul in care informatiile din i-node indica blocurile ce fac parte din fisier, este:

pointeri spre primele 10 blocuri ale fisierului;

daca fisierul e mai lung de 10 blocuri, apare un pointer spre un bloc, blocul simplu indirect, in care se pun pointerii spre urmatoarele blocuri;

daca fisierul are mai multe blocuri decat se pot reprezenta astfel, urmeaza un pointer la un bloc in care sunt pointeri la blocuri care tin pointeri la blocurile fisierului: indirectare dubla;

daca nu este suficient, se realizeaza o indirectare tripla.

Un fisier poate avea mai multe nume, dar exista un singur i-nod asociat. Relatia stabilita intre nume si i-nod se numeste legatura.

Numele fisierelor nu pot depasi 255 de caractere. Orice caractere sunt permise, cu exceptia /, care este delimitatorul de nume de director. Se face distinctie intre literele mari si literele mici - case sensitive.

Este bine sa se evite a se folosi in numele fisierelor caracterele ce au o semnificatie speciala in shell:

! # & @ $ ^ ( ) ' ' ; | < > [ ] * ?

In UNIX nu exista notiunea de extensie de fisier, asa cum este in DOS sau Windows. Punctul poate face parte din nume; de exemplu aa este un nume valid de fisier. Fisierele al caror nume incepe cu , sunt fisiere ascunse. Uneori este necesar ca numele fisierului sa aiba o extensie: .sh pentru programe shell, .c pentru programe C.

Fisiere director

Directoarele ( sau cataloagele ) ofera posibilitatea de accesare a fisierelor prin nume, nu prin i-node, de asemenea modalitatea de structurare ierarhica a acestora. Directoarele sunt fisiere care contin informatii despre subdirectoarele si fisierele continute.

Exista un director root , notat , care este radacina structurii arborescente a fisierelor. Identificarea unui fisier se poate face precizand calea ( path ) si numele; calea se poate preciza absolut, pornind de la root, sau relativ la directorul curent.

In cadrul fiecarui director exista doua fisiere numite si care semnnifica directorul curent si cel radacina.

Fisiere speciale

Fisierele speciale sunt fisiere asociate dispozitivelor fizice ( discuri, imprimante, mouse ) sau virtuale ( memoria interna, terminale ). Utilizatorii pot efectua schimburi de date cu perifericele fara a fi nevoiti sa cunoasca detalii despre mecanismul de functionare a acestora, tratarea lor fiind uniforma cu a fisierelor obisnuite si beneficiind la fel de mecanismul de protectie.

Legaturi

Un fisier este caracterizat, identificat prin i-nodul asociat; poate avea insa mai multe nume. Relatia stabilita intre nume si i-nod se numeste legatura - link. Sa detaliem mai mult acest aspect.

Putem privi o legatura ca un alt nume ( alias ) al fisierului. Presupunem ca doi utilizatori trebuie sa lucreze asupra aceluiasi document; daca fiecare ar pastra copia documentului, s-ar putea ca sa se desincronizeze. Solutia este utilizarea unei legaturi, utilizatorii partajand acelasi fisier, chiar daca acesta apare utilizatorilor cu nume diferite.

Exista doua tipuri de legaturi:

simbolice - symbolic links - fisierul legatura contine de fapt numele fisierului original

fizice - hard links.

Linkurile permit asignarea mai multor nume unui fisier ordinar, dar nu si unui director; nu se pot crea de asemenea legaturi decat intre nume de fisiere situate pe acelasi computer. Cand se opereaza asupra unui fisier legat , se lucreaza de fapt asupra fisierului de baza, pe care legatura il indica.

Crearea legaturilor se realizeaza cu comanda ln:

creaza o legatura fizica pentru fisier1, numita fisier2

ln fisier1 fisier2

creaza o legatura simbolica pentru fisier1, numita fisier2

ln -s fisier1 fisier2

3.2 Structura generala de directoare

Structura generala a arborelui directoarelor este standardizata in documentul Filesystem Hierarchy Standard, cea mai recenta versiune fiind din ianuarie 2004.

Structura este urmatoarea, fiind tipica pentru toate sistemele Unix:


root
|
-------- ----- ------ ----- ----- -------------
| | | | | | | | | |
bin boot dev etc home lib mnt sbin usr tmp
|
----- ----- --------
| | |
user_1 user_2 user_n

Sa vedem ce fel de fisiere contin cele mai importante directoare din structura:

/bin - contine utilitarele/comenzile uzuale;

/dev - contine fisierele speciale asociate perifericelor;

/etc - contine utilitarele speciale de configurare/administrare:

o                    /etc/passwd - informatii despre utilizatori

o                    /etc/passwd - informatii despre grupuri

o                    /etc/services - informatii despre serviciile de retea suportate

o                    /etc/protocols - informatii despre protocoalele de retea suportate;

/home - contine directoarele de lucru pentru fiecare utilizator;

/lib - contine bibliotecile utilizate de compilatoare;

/mnt - director de montare a unor sisteme de fisiere externe;

/usr -este cel mai mare director al sistemului, cu fisiere utilizate de membri, doar pentru citire; are subdirectoarele:

o                    /usr/bin - alte utilitare

o                    /usr/sbin - utilitare si daemoni

o                    /usr/share/man /usr/share/doc - manuale si documentatie;

/tmp - contine fisiere temporare folosite de editor, compilatoare.

Montare fisiere

Fisierele speciale care indica unitati de disc sau partitii sunt folosite in operatia numita montare a sistemelor de fisiere. Sistemul de operare Unix/Linux permite montarea intr-un director a unui sistem de fisiere aflat pe un disc sau o partitie.

Aceasta inseamna ca dupa montare, in directorul respectiv se va afla intreaga structura de fisiere si directoare de pe sistemul de fisiere respectiv. Mecanismul este deosebit de puternic, deoarece ofera posibilitatea de a avea o structura de directoare unitara, care grupeaza fisiere de pe mai multe partitii sau discuri.

Daca se adauga si sistemul de fisiere NFS (Network File System), aceasta structura de directoare va putea contine si sisteme de fisiere montate de la distanta (de pe alta masina)

Montarea unui sistem de fisiere se face cu comanda mount.

Data fara nici un parametru, ea afiseaza sistemele de fisiere montate in momentul respectiv in sistem.

O alta forma a ei este urmatoarea:

mount fisier-special director

care monteaza un disc sau o partitie intr-un director dat; sau

mount -t tip fisier-special director

cu acelasi efect, doar ca se specifica in clar tipul sistemului de fisiere care se monteaza.

Diferitele variante de Unix cunosc mai multe sau mai putine tipuri de sisteme de fisiere.

Spre exemplu, Linux cunoaste:minix - sistemul de fisiere al sistemului de operare MINIX

ext2 - Second-Extended File System - sistemul caracteristic Linux

msdos - sistemul de fisiere DOS FAT16 sau FAT12

vfat - sistemul de fisiere DOS cu extensia pentru nume lungi introdusa de Windows 95

iso9660 - sistem de fisiere pentru CD-ROM (cel mai raspandit) cu o serie de extensii ale sale

proc - un sistem de fisiere virtual ale carui componente furnizeaza informatii despre starea sistemului.

De obicei, montarea de sisteme de fisiere poate fi facuta numai de catre utilizatorul root (cel mai privilegiat utilizator, administratorul sistemului), dar se poate permite si utilizatorilor obisnuiti sa monteze anumite partitii sau unitati de disc.

Exemplu:

Montarea unei dischete introdusa in prima unitate de dischete, care contine si fisiere cu nume lungi create in Windows se face astfel

mount /dev/fd0 diskA

unde diskA este numele directorului in care se va monta discheta, aflat in directorul curent.

Important: Orice sistem de fisiere montat de pe o unitate de disc care permite inlaturarea discului respectiv trebuie demontat inainte de a scoate discul. De asemenea, inainte de inchiderea sau repornirea calculatorului, trebuie de-montate si sistemele de fisiere de pe discurile fixe (in Linux, aceasta din urma operatie se efectueaza automat la restartarea sistemului prin apasarea simultana a tastelor Ctrl+Alt+Del). De-montarea fisierelor se face cu comanda

umount fisier-special

sau

umount director

, unde director este numele directorului in care a fost montat sistemul de fisiere.

3.3 Alte resurse

Filesystem Hierarchy Standard

Unix Acronym List

On-line UNIX manual pages

3.4 Aplicatii

1. Sa incercam sa gasim raspunsul la intrebarea: Daca dimensiunea unui bloc este de 1024 o, iar un pointer la bloc este pe 4 o, cate blocuri de date sunt necesare pentru un fisier de 275000 o?

a)275;
b)274;
c)276;
d) alta valoare.

Mai jos apare schema reprezentarii blocurilor ocupate de fisier si calculul:

275000 / 1024 + 1 = 269 blocuri pentru date
Pentru adrese inca 4 blocuri ( unul fiind pentru i-node )
269 + 4 = 273 blocuri

Raspunsul este d)

2. Daca lungimea unui bloc este de 1024 octeti, in cazul indirectarii duble, care este dimensiunea maxima a unui fisier? Dar pentru indirectare tripla?

3. Explorati structura de directoare folosind comenzile cd ( change directory ) si ls ( list ) si comparati-o cu prezentarea de mai sus.

Modul 4: Comenzi referitoare la fisiere

Interpretarea comenzilor

Comenzi pentru gestiunea directoarelor

Comenzi pentru gestiunea fisierelor

Comenzi informative si pentru terminale

Alte informatii

Aplicatii

4.1 Interpretarea comenzilor

Specificarea fisierelor

Am vazut ca fiecare fisier este identificat intern prin i-nodul sau si are unul sau mai multe nume. In cadrul comenzilor, pentru fisiere se foloseste numele.

Specificarea unui fisier se face prin:

cale_de_acces nume

Calea de acces poate fi:

absoluta - calea pleaca din root , indicandu-se toate nivelele arborelui pana la fisierul desemnat

relativa - cand calea pleaca din directorul curent.

Daca nu este specificata nici o cale, ci doar numele, referirea este la un fisier din directorul curent.

Mecanismul de protectie a fisierelor

Mecanismul de protectie a fisierelor este simplu, dar eficient. i-nodul asociat unui fisier contine drepturile de acces la acel fisier. Exista trei tipuri de acces la un fisier:

Tip de acces

Semnificatie pentru fisier obisnuit

Semnificatie pentru director

read r

vizualizare a continutului

vizualizare a fisierelor continute

write w

modificare a continutului

creare si stergere de fisiere

execute x

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) - grupul de utilizatori din care face proprietarul

ceilalti utilizatori (o)

Sistemul de protectie al fisierelor mentine informatii despre drepturile de acces pe care le are fiecare categorie de utilizatori. Schimbarea drepturilor de acces se face
prin comanda chmod , care va fi prezentata mai jos.

Cum lucreaza shell-ul

Dupa furnizarea catre procesul login a numelui utilizator si a parolei, acest proces face curent directorul respectivului utilizator - numit home directory, indicat in linia din fisierul /etc/passwd corespunzatoare utilizatorului si lanseaza in executie programul al carui nume figureaza in ultimul camp al aceleeasi intrari.

Acest program este un interpretor de comenzi, un shell. Lansarea sa in executie are loc fara crearea unui proces nou, procesul login fiind practic inlocuit cu noul program.

Interpretorul de comenzi lucreaza asemanator interpretoarelor de comenzi din alte SO:

afiseaza un prompt

preia comanda si argumentele si:

o                    daca acea comanda este comanda interna o executa, altfel;

o                    numele comenzii este folosit pentru identificarea unui fisier executabil care este incarcat si executat

dupa terminarea executiei comenzii reapare promptul ce invita utilizatorul sa introduca o noua comanda.

Spre deosebire de alte sisteme de operare, unde interpretorul de comenzi este un program privilegiat ( command.com in Dos ), in Unix shell-ul este considerat ca fiind un program obisnuit, neavand prioritate mai mare decat alte procese.

Dupa cum am discutat in primul modul, shell-ul nu face parte din nucleul sistemului de operare. Exista mai multe interpretoare disponibile, utilizatorul putand sa ceara incarcarea celul dorit de el. Cele mai cunoscute interpretoare de comenzi sunt:

sh - shell

csh - C-shell

ksh - KornShell

bash - Borne Again Shell.

Dupa cum se vede in imaginea de mai jos, la intrarea in sesiune a utilizatorului credis-hc, s-a lansat in executie shell-ul bash ( /bin/bash ) si directorul curent a devenit /home/credis-hc; aceste informatii se regasesc in linia din /etc/passwd, corespunzatoare utilizatorului; linia a fost selectata cu utilitarul grep, care cauta credis-hc in continutul fisierului /etc/passwd afisat cu comanda more:

more /etc/passwd | grep credis-hc

Procedati ca in imaginea de mai sus si identificati pentru utilizatorul propriu:

home directory si

shell-ul lansat.

Sintaxa comenzilor

Toate comenzile au urmatoarea sintaxa:

comanda

comanda reprezinta o comanda interna ( executata direct de shell ) sau numele unui program executabil, cautat in urmatoarea secventa:

in directorul curent

in directorul /bin

in directorul /usr/bin - ne amintim Structura de directoare discutata la Modulul 3

mesaj de eroare daca nu este gasit in locurile specificate mai sus

Celelalte campuri ale comenzii definesc parametrii comenzii si se numesc argumente, care se separa prin blank-uri. Se pot introduce mai multe comenzi pe aceeasi linie, separate prin punct-virgula .

Se poate introduce comentariu intr-o linie de comanda: ceea ce apare dupa se considera comentariu.

Daca la introducerea unei comenzi se doreste anularea ei ( bineinteles inainte de a tasta Enter ), se introduce CTRL/U - verificati!

Metacaractere

In multe comenzi, argumentele reprezinta nume de fisiere; pentru a ne putea referi fisiere care au caracteristici comune, au fost introduse caractere speciale, numite metacaractere. Vom vedea ca aceste metacaractere sunt folosite si de utilitarele specializate inpe prelucrarea fluxurilor de date, ca sed, grep, egrep.

Metacaracterele sunt urmatoarele:

orice sir de caracter, inclusiv sirul vid
orice caracter
abc oricare caracter dintre cele precizate
a b un caracter din ordonarea lexicografica dintre cele 2 precizate

Exemple:

- toate fisierele

*.c - toate fisierele sursa C

tema?.txt - toate fisierele text care au prefixul tema

tema[1-4] - fisierele tema1, tema2, tema3, tema4

tema[14] - fisierele tema1, tema4

test*? - toate fisierele care incep cu test si mai au cel putin un caracter in nume

test[*?] - toate fisierele care incep cu test, echivalent cu test*

Redirectarea fisierelor

La pornirea shell-ului, la intrarea intr-o sesiune de lucru, se deschid trei fisiere standard:

intrare - tastatura

iesire - ecran

afisarea erorii - ecran.

In momentul in care interpretorul lanseaza programul asociat unei comenzi, acesta mosteneste si fisierele deschise, deci si pe cele standard. Programele
devin astfel independente de dispozitivele fizice asociate de shell fisierelor standard.

Interpretorul permite redirectarea fisierelor standard de I/E spre alte fisiere sau periferice.

De exemplu, daca un program are ca iesire standard ecranul, se pot trimite datele, prin operatia de redirectare, catre un fisier text specificat.

Redirectarea se specifica prin simbolurile:

< - redirectare fisier standard de intrare: shell-ul nu va mai lua datele de la tastatura, ci dintr-un fisier indicat dupa operatorul <

> - redirectare fisier standard de iesire: shell-ul nu va mai scrie rezultatul comenzii pe ecran, ci in fisierul indicat dupa operatorul >; daca fisierul nu exista este creat, altfel este rescris - rewrite

>> - ca mai sus, doar ca daca fisierul exista, se scrie in continuare - append

2> 2>> - redirectare fisier standard de eroare

Exemplu:

rezultatul comenzilor, respectiv informatiile despre continutul directorul curent si despre i-noduri sunt redirectate spre fisierul continut.txt, care este rescris, apoi se scrie in continuare:

ls -l >continut.txt

ls -i >>continut.txt

Comunicarea intre procese prin pipe

Comunicarea intre procese poate fi realizata prin redirectare, primul proces depune datele intr-un fisier, de unde sunt citite de al doilea proces sau prin tehnica numita pipe (conducta), folosind operatorul . Prin pipe, iesirea unei comenzi devine intrarea celei de a doua, folosindu-se un fisier implicit, temporar.

Am vazut un astfel de exemplu mai sus:

more /etc/passwd | grep credis-hc

Iesirea comenzii more devide intrarea comenzii grep.

Folosind redirectarea se poate scrie o prelucrare similara, fisierul temp il sterg la sfarsit:

more /etc/passwd > temp

grep credis-hc < temp

rm temp

Pot scrie toate comenzile pe o linie, separate prin :

more /etc/passwd > temp ; grep credis-hc < temp ; rm temp

Se poate observa ca pipe este o facilitate puternica, eleganta.

4.2 Comenzi pentru gestiunea directoarelor

In cele ce urmeaza, pentru precizarea sintaxei comenzilor, se vor folosi notatiile:

[identificator] - camp optional;
(identificator) - identificator de fisier sau director;
identificator - identificatorul se repeta;

pwd

Tipareste calea absoluta a directorului curent, pornind din root; este folosita pentru a vedea unde este plasat directorul curent in structura directoarelor sistemului.

cd [director]

Schimba directorul curent, directorul specificat devenind cel curent.

Exemple:

cd .. directorul parinte devine curent

Oricare dintre cele trei comenzi de mai jos, fac curent home directory.

cd

cd ~

cd $HOME

ls [optiuni] (fisier)

Listeaza continutul unui director, conform optiunilor precizate. Daca nu se precizeaza nici un director, implicit se considera cel curent.

Optiunile cele mai importante sunt:

- se listeaza fiecare intrare din director pe cate o linie;
-a - listare si pentru fisiere ascunse ( hidden );
-d - listeaza doar numele directoarelor;
-i - indica i-nodul fiecarui fisier;
-l - listeaza mai multe informatii despre fisiere ( long listing ) ;
-g - se indica identificatorul grupului proprietar al fisierului;
-p - dupa numele fisierelor apare , respectiv dupa legaturi logice;
-r - listare in ordine invers alfabetica;
-R - listare recursiva, pentru fiecare subdirector descendent din cel precizat in comanda;
-s - dimensiunea fisierelor se da in numar de blocuri;
-t - se afiseaza fisierele sortate dupa data ultimei modificari, cele mai noi la inceput.

Se pot preciza mai multe optiuni dupa un singur .

mkdir director

Creaza un director nou cu numele precizat. Sunt setate automat si drepturile de acces.

rmdir director

Directorul specificat este sters daca este vid; daca nu este vid, este necesara stergerea fisierelor continute folosind comanda rm.

du [(directoare)]

Afiseaza spatiul in blocuri ocupat de fiecare fisier din directoare.

du # afiseaza spatiul ocupat de fisierele directorului curent

du -s # afiseaza spatiul total ocupat de directorul curent

4.3 Comenzi pentru gestiunea fisierelor

cat [(fisiere)]

Concateneaza fisiere text si afiseaza rezultatul concatenarii la fisierul standard de iesire. Daca nu se specifica nici un fisier, se considera cel standard de intrare.

Exemple:

cat fis1 # afiseaza fis1 la terminal

cat fis1 fis2 >fis # concateneaza fisierele fis1 si fis2 si redirecteaza rezultatul in fis;

cat fis[12] >fis # ca mai sus

cat >fis # liniile introduse de la tastatura pana la CTRL/D sunt introduse in fis

lp [optiuni] [(fisier)] sau lpr

Tipareste fisierele la imprimanta.

lp -n 4 -m myfile # tipareste 4 copii ale myfile, trimite la terminare un e-mail

wc [optiuni] [(fisier)]

Numara caracterele, cuvintele si liniile din fisierele precizate.

Optiuni - fara nici o optiune se afiseaza toate cele 3 informatii:
-w -numararecuvinte
-c - numarare caractere
-l - numarare linii

wc # afiseaza numara de caractere, cuvinte, lini tastate pana la CTRL/D

who | wc -l # afiseaza numarul de utilizatori activi

ls -1 | wc -l # afiseaza numarul de intrari din directorul curent

wc fis # echivalenta cu

cat fis | wc

file (fisier)

Determina tipul unui fisier, comparand cu informatia din fisierul magic; functie de versiunea SO, poate fi /etc/magic sau /usr/share/magic.

touch [optiuni] [date] (fisier)

Modifica timpul de acces al fisierelor la data specificata.

Fara optiuni creeaza fisierele specificate ca fisiere vide, daca ele nu exista; daca exista, modifica timpul de acces la data curenta.

Mai jos, daca fisiernou nu exista, cele doua comenzi sunt echivalente, in situatia in care la a doua, CTRL/D se introduce introduce imediat dupa lansarea comenzii:

touch fisiernou

cat > fisiernou
CTRL/D

rm [optiuni] (fisier)

Sterge fisierele precizate. Optiuni:
-i - intreaba utilizatorul inainte de stergerea fiecarui fisier;
-r - cere confirmarea de stergere inainte de stergerea fiecarui subdirector;
-f - sterge fisierul fara a analiza daca exista dreptul de scriere in fisier.

rm -i * # sterge toate fisierele din directorul curent, cu confirmare

rm -r mydir # sterge tot subarborele ce are radacina in mydir

cp [optiuni] (fisier1) (fisier2) sau
cp [optiuni] (fisier) (director)

Copiaza un fisier in altul, respectiv fisierele precizate intr-un director.

Optiuni:
-i - intreaba utilizatorul inainte de copiere in fisiere existente;
-r - copiere recursiva a intregii structuri de subdirectoare pentru directorul precizat ca sursa.

cp myfis .. # copiaza myfis din directorul curent in cel parinte, pastrand numele

cp myfis ../newfis # copiaza myfis din directorul curent in cel parinte, sub numele newfis

mv (fisier1) (fisier2) sau
mv (fisier) (director)

Redenumeste fisierul precizat, respectiv muta intr-un director.

ln (fisier1) (fisier2) sau
ln -s (fisier1) (fisier2)

Creaza fisier2 ca legatura hard, respectiv simbolica pentru fisier1.

more [optiuni][(fisier)]

Afiseaza fisierele precizate la terminal, ecran cu ecran - iesire tastand q; comanda este similara cu cat, dar acolo defilarea este continua. Foarte mult folosita in pipe.

more myfis # afiseaza myfis, ecran cu ecran

ls -R / | more # afiseaza tot sistemul de fisiere, ecran cu ecran; cate linii sunt? iata:

ls -R / | wc -l

head [-n][(fisier)]
tail [-n][(fisier)]

Afiseaza primele n ( implicit 10 ), respectiv ultimele n linii din fisierele precizate la terminal.

head /usr/share/magic # vreau sa vad cam ce contine fisierul magic; cate linii are? iata:

cat /usr/share/magic | wc -l

tail fisier | wc -l # asa ma conving ca implicit se afiseaza 10 linii

chmod (drepturi) (fisier)

Schimba drepturile de acces pentru un fisier; comanda poate fi utilizata doar de proprietarul fisierului asau un super user.

Precizarea drepturilor se face sub forma: (cine) (op) (drept), unde:
(cine) reprezinta:u-proprietar, g-grupul, o-ceilalti,a (toti)
(drept)-r,w,x
(op) operatorul aplicat: - (retrage drept), + (adauga drept),= (asigneaza drept)

De asemenea drepturile pot fi precizate in octal, cu cate o cifra pentru fiecare grup.

Exemple:

chmod a+r fis # acorda drepturi de citire tuturor utilizatorilor fisierului fis;

chmod a+r,a-wx fis # acorda doar drepturi de citire tuturor utilizatorilor fisierului fis; echivalent cu:

chmod 444 fis

chmod go-rw fis # retrage drepturile de citire pentru grup si ceilalti;

chmod a=rwx fis # asigneaza tuturor drepturi complete asupra fisierului; echivalent cu:

chmod 777 fis

chmod a-w # retrage dreptul de a crea fisiere in directorul curent.

Mai jos se poate urmari o succesiune de comenzi care creeaza legaturi, schimba drepturi de fisiere, modificarile fiind evidentiate de informatia listata cu ls:

4.4 Comenzi informative si pentru terminale

In Modulul 2 am amintit comenzile:

modificarea parolei:

passwd

afisarea username-ului utilizatorului curent:

whoami

afisarea utilizatorilor care sunt in sesiune de lucru:

who

who -m

are acelasi efect ca whoami

who am i

ca mai sus; oricare doua argumente echivaleaza cu -m

afisarea utilizatorilor care sunt in sesiune de lucru si procesele lor active ( se poate deci vedea ce lucreaza fiecare ):

w

afisarea de informatii din manualul de referinta online al sistemului:

man

man comanda

sau

comanda --help

afisarea de informatii despre sesiunile de lucru ale tuturor utilizatorilor, respectiv ale utilizatorului specificat ( IP de unde s-a intrat, momentele intre care a durat sesiunea ); nu e greu de stiut astfel cat de harnici sunt utilizatorii din sistem, nu? :-)

last

last userid

iesire din sesiune:

logout

exit

CTRL/D

Importante din categoriile informative si pentru terminale mai sunt:

cal [luna] [an] ]

Afiseaza calendarul; implicit pentru luna curenta.

clear

Sterge terminalul.

date

Afiseaza data si ora curente; utilizatorii privilegiati pot seta timpul.

echo [argumente]

Scrie argumentele la terminal.

echo # un rand liber

echo Buna!

echo 'linia 1' > fis # redirectare spre fis

finger [(nume)]

Afiseaza informatii despre utilizatorii conectati la sistem - mai multe decat who.

tty

Afiseaza numele terminalului.

write (utilizator)

Trimite un mesaj la terminalul utilizatorului specificat; mesajul se termina cu CTRL/D.

whatis (comanda)

Afiseaza o scurta descriere despre fiecare dintre comenzile date ca parametru, prin accesarea manualului de referinte.

whatis ls whatis # afiseaza informatii despre ls si whatis insasi

which (comanda)

Listeaza care fisiere sunt executate pentru comenzile precizate; in felul acesta se poate afla unde sunt localizate comenzile in structura de directoare.

which man login # va afisa /usr/bin/man si /bin/login

4.5 Alte resurse

Commonly used Unix commands

Unix top 10 commands

4.6 Aplicatii

Va rog sa testati cat mai multe dintre comenzi. Neclaritati, comentarii, completari, se vor scrie la Software Consulting.

Scopul temei de mai jos este intelegerea structurii de fisiere, a comenzilor referitoare la fisiere.

Va trebui sa creati o structura de directoare, apoi un fisier cu rezultate, al carui continut sa-l trimiteti ca raspuns in Conferinta Tema 1.

Puteti lucra in contul telnet sau pe calculatorul propriu.

Orice neclaritati le discutam la Software Consulting.

Partea I

1. Creati in home directory un director numit Tema1;

2. Faceti curent acest director, in care creati subdirectoarele Autori si Carti;

3. In Autori creati fisierele Ion.Creanga, Mihai.Eminescu, folosind cate o comanda echo si operatorul de redirectoare >:

echo 'Este unul dintre marii scriitori romani' > numeFisier

4. In Carti creati fisierele Amintiri.din.copilarie, Luceafarul, folosind comanda

cat > numeFisier

, care va memora liniile tastate pana la CTRL/D in fisierul cu numele precizat.

Amintiri.din.copilarie sa contina liniile:
Autor: Ion Creanga
Publicat: 1881-1883

Luceafarul sa contina liniile:
Autor: Mihai Eminescu
Publicat: 1883

5. In directorul Tema1 creati o legatura hard intre Ion.Creanga si Humulesti si una simbolica intre Mihai.Eminescu si Ipotesti;

Partea 2

1. Cu comanda touch creati fisierul vid $HOME/rezultat1;

2. Cu comanda echo plasati in acest fisier numele vostru; redirectati ( adaugare ) rezultatul comenzii whoami in acelasi fisier.

3. Directorul curent fiind Tema1, redirectati ( adaugare ) rezultatul comenzii

ls -Rl # listare recursiva, format lung

in fisierul $HOME/rezultat1;

4. Pentru fisierele din Autori, dati drept de modificare pentru toate grupurile.

5. Pentru fisierele din Carti, lasati drept de citire doar pentru proprietar.

6. Directorul curent fiind Tema1, redirectati ( adaugare ) rezultatul comenzii

ls -Rli # listare recursiva, format lung, i-node

in fisierul $HOME/rezultat1;

7. Copiati continutul fisierului $HOME/rezultat1 si trimiteti-l in Conferinta Tema1.

Succes!

Modul 5: Partitionare. Managere de fisiere in Linux

Partitionare

Midnight Commander

Konqueror (KDE)

Nautilus (Gnome)

Alte informatii

Sa discutam

Informatiile despre partionare sunt necesare pentru instalarea unei distributii Linux.

Este util de asemenea sa ne familiarizam si cu utilitarele grafice care permit gestionarea fisierelor.

Managerele de fisiere ( File Managers ) sunt utilitare care ofera instrumentele necesare lucrului cu fisiere si directoare: copiere, mutare, redenumire, stergere, creare, vizualizare, editare, etc.

Linuxul ofera implicit trei programe de acest gen:

Midnight Commander

Konqueror (KDE)

Nautilus (Gnome).

Exista si alte utilitare care pot fi descarcate de pe Internet si instalate, cel mai cunoscut fiind Krusader care ofera o interfata foarte asemanatoare cu cea a programului Total Commander din Windows.

Trebuie facuta urmatoarea remarca: daca Windows-ul ofera o singura interfata grafica cu utilizatorul, Linux-ul ofera mai multe, cele mai importante fiind KDE si Gnome fiecare oferind in plus o serie de utilitare. Puteti opta sa instalati unul sau mai multe interfete, urmand ca inaintea folosirii sa specificati cu care interfata doriti sa lucrati.

Distributia Knoppix ofera doar interfata KDE datorita spatiului limitat.

5.1 Partitionare

Trebuie mentionat de la inceput faptul ca majoritatea distributiilor de Linux pot conlucra cu alte sisteme de operare aflate pe acelasi calculator, cazul cel mai frecvent fiind Microsoft Windows; de aceea va fi prezentat in continuare modul de instalare a unei distributii Linux pe un calculator care are deja un sistem de operare.

Primul pas consta in realizarea a doua noi partiti pentru Linux, pe langa partitiile de Windows deja existente. Cazul cel mai frecvent este acela in care pe calculator exista o singura partitie de Windows, caz care va fi luat in considerare mai departe. Daca exista mai multe partitii, atunci se pot redimensiona una sau mai multe partitii existente pentru a crea spatiu noilor partitii de Linux.

Atentie: Este bine ca inainte de a lucra cu partitiile, sa se faca un back-up al fisierelor importante pe disketa, CD sau memorii USB.

Partitionarea unui harddisk poate fi realizata cu programe specifice de genul PartionMagic sau cu ajutorul unor distributii Linux care au aceasta facilitate in timpul instalarii, de exemplu MandrakeLinux.

In continuare va fi prezent modul de lucru cu utilitarul PartitionMagic:

In partea superioara a aplicatiei, apare un grafic cu mai multe dreptunghiuri colorate care reprezinta partiile unui harddisk, iar sub acest grafic observati o lista cu detaliile despre partitii.

In exemplul de mai sus pentru primul harddisk (Disk1) avem 4 partitii, fiecare partitie cu un alt sistem de fisiere: NTFS (colorat in roz) si FAT32 (colorat in verde) apartinand sistemului de operare WindowsXP, LinuxExt2 (colorat in mov) si LinuxSwap (colorat in maro), apartinand sistemului de operare Linux. Pe aceste partitii se afla sistemele de operare, datele si programele voastre.

O partitie poate fi primara sau extinsa. In partitia extinsa se pot crea oricate discuri logice (vazute tot ca si partitii). Pe un disc fizic pot exista maxim 4 partitii primare, cand nu mai se poate crea partitia extinsa, caz ilustrat si de figura de mai sus; sau mai putine partitii primare (cel putin una), caz in care se poate crea si partitia extinsa.

Vom discuta cazul in care pe calculator exista o singura partitie si anume cea de Windows. Pentru ca aceasta partitie sa poata fi micsorata, este necesar ca aceasta sa contina suficient spatiu liber, spatiu care va fi folosit in continuare pentru crearea de noi partitii. Este bine ca partitia sa fie si defragmentata prin folosirea utilitarului Disk Defragmenter (Start->Programs->Accessories->System Tools->Disk Defragmenter).

Se selecteaza din grafic partitia de Windows si se apasa butonul drept al mouse-ului. Va apare un meniu care va permite printre altele "Resize/Move". Se selecteaza aceasta optiune si va apare o fereastra de forma:

Bara colorata reprezinta partitia selectata. Partea colorata mai inchis reprezinta fisierele, partea colorata mai deschis este spatiul liber al partitiei. Bara are la cele doua capete cate o sageata. Se foloseste sageata din dreapta pe care o veti trage spre stanga. Zona gri reprezinta spatiul liber nou creat. Este de preferat ca acest spatiu sa aiba dimensiunea de aprox 3,000.0 MB (Free Space After). Se apasa OK.

Se revine in fereastra principala de unde se selecteaza butonul "Create new partition" aflat in stanga jos. Se apasa Next, se lasa No si se da Next. Se selecteaza "ext2" (sau "ext3" daca se poate), partition type: logical, se lasa locatia recomandata si se apasa Next.

Sunteti intrebat de unde se mai poate lua spatiu pentru viitoarea partitie. Din lista se deselecteaza partiile, astfel incat sa nu ia si alt spatiu decat cel liber si se apasa Next.

Se introduce spatiul care va fi ocupat de noua partitie. Vedeti cat apare la Maximum size. Din acea valoare se scade spatiul pentru a doua partitie pe care o veti crea mai tarziu si care va fi de aprox 1,000.0 MB, deci spatiul care il va ocupa noua partitie va fi: Maximum size - 1,000.0 MB
Se apasa Finish.

Pentru a doua partitie pe care o veti crea se reiau pasii de mai sus (incepand cu apasarea pe butonul "Create new partitions"). Se va selecta "ext2" (sau "swap" daca se poate). Spatiul pe care il va ocupa va fi cel aratat de Maximum size. In final se apasa Finish.

Daca pe parcurs ati gresit un pas se poate tasta butonul Undo pentru revenire.

Din fereastra principala se pasa butonul "Apply changes" din dreapta jos, pentru a face modificarile si se apasa Yes pentru confirmare caz in care nu se mai poate reveni.

In final veti avea doua partii nou create: una mare "ext2" pe care in timpul instalarii o veti formata ca "ext3" si una mai mica "ext2" pe care o veti formata in "swap".

Daca aveti o versiune de Partition Magic care va permite crearea de partitii "ext3" si "swap" atunci la final veti avea doua partii: una mare "ext3" si una mai mica "swap".

Pe partitia de ext3 se va instala sistemul de operare Linux, iar partitia de swap va fi folosita de acesta pentru depozitarea de fisiere temporare. Ambele partitii sunt obligatorii.

Nota: daca folositi un alt progam de partitionare (ex: cel din MandrakeLinux in timpul instalarii), pasii sunt asemanatori cu ce a fost prezentat mai sus: se micsoreaza o partitie existenta si se creaza doua noi partitii pe spatiul liber creat.

5.2 Midnight Commander

Midnight Commander este o 'clona' a cunoscutului Norton Commander de sub DOS. Pentru pornire se va da comanda:

mc

Cele mai importante comenzi sunt afisate in bara de jos si pot fi accesate prin intermediul tastelor functionale F1-F10, de exemplu pentru copiere se apasa tasta F5. Pentru a accesa bara de meniuri din partea de sus a programului se apasa F9.

F1-pagina de ajutor
F2-meniu utilizator (cu cele mai dese comenzi)
F3-afisarea continutului unui fisier
F4-editarea continutului uui fisier
SHIFT-F4 - creare si editare fisier nou
F5-copiere fisiere si directoare
F6-mutare sau redenumire (daca in dreptul campului 'to:' se scrie doar numele nu si calea)
F7-creare director
F8-sterge fisire si directoare
F9-meniu (bara de sus)
F10-iesire din program

Programul contine 2 zone numite panouri (panels), fiecare afisand continutul unui director. Deasupra fiecarui panou este afisat numele directorului afisat, pentru home-ul utilizatorului se foloseste caracterul: ~ .

Panoul activ este cel in care se afla cursorul. Trecerea de la un panou la celalalt se face prin apasarea tastei TAB. Pentru selectarea/deselectare fisiere si directoare sa va folosi tasta INS, pentru selectare in grup: tasta +, pentru deselectare in grup: tasta -

Impartirea pe panouri permite realizarea mai usoara a operatiilor de copiere, mutare sau creare de legaturi. Panoul sursa este cel in care se afla cursorul, iar directorul destinatie este dat de panoul opus care afiseaza respectivul director.

Pentru schimbarea permisiunilor unui fisier/director se va parcurge secventa: F9 -> File -> Advanced chown. Pentru setare/anulare indicatori rwx se va face prin '+' respectiv '-'.
Crearea de legaturi se face prin: F9 -> File -> SymLink. In campul 'symbolic link filename' se va scrie numele si destinatia legaturi pentru fisierul/directorul selectat.
Cautarea unui fisier, director sau secventa de caractere se face prin: F9 -> Command -> Find file.

5.3 Konqueror (KDE)

Konqueror este un program complex oferind mai multe moduri de lucru: manager de fisiere (cu un singur panou ca Windows Explorer sau cu 2 panouri ca Midnight Commander) si browser web.

In Knoppix pornirea managerului de fisiere se face apasand a 5-a pictograma (reprezentand o casa), iar pentru browser-ul web se apasa pictograma a 7-a din bara de jos. Schimbarea modului de lucru se poate face si prin pornirea programului urmand ca sa se realizeze urmatoarea succesiune: Settings -> Load View Profile.

Implicit, managerul de fisiere are o singur panou, lucrul fiind foarte asemanator cu Windows Explorer.

Continutul directorului dorit este afisat intr-o fereastra, calea acestuia fiind afisata in campul Location. Afisarea directorului parinte se face prin apasarea primului buton din bara de pictograme. Apasarea butonului dreapta al mouse-ului duce la afisarea unui meniu contextual functie de locatia pointer-ului mouse-ului in zona de afisare a directorului curent.

Copierea si mutarea se face ca si la Windows Explorer: se selecteaza fisierele/directoarele dorite iar apoi se poate folosi meniul contextual de unde se alege destinatia, sau se foloseste drag-and-drop intr-o alta fereastra daca s-au pornit mai multe ferestre (Location -> New Window).

Pentru schimbarea proprietatiilor se foloseste meniul contextual si se foloseste Properties. Din acest loc se poate alege schimbarea permisiunilor prin: Permission -> Advanced Permissions:

Functia de cautarea poate fi pornita prin: Tools -> Find file.

5.4 Nautilus (Gnome)

Nautilus este un manager de fisiere mai simplu decat Konqueror. Fiecare fereastra afiseaza continutul unui director, numele acestuia aparand in titlul ferestrei. Intrarea intr-un director duce la deschiderea unei noi ferestre, dezavantajul fiind acela ca la un moment dat, dupa un numar de pasi, vor fi deschise foarte multe ferestre.

Revenirea intr-un director parinte din fereastra curenta se face prin apasarea sagetii de langa numele directorului in coltul din stanga jos.

Copierea si mutarea se face la fel ca si la Konqueror, la fel exista facilitatea de meniu contextual:

5.5 Alte resurse

IOSN - User Guide to Using the Linux Desktop

IOSN - User Guide to Using the Linux Desktop - Interactive (Beta 1)

5.6 Sa discutam

Incercati sa va familiarizati cu managerele de fisiere.

In Conferinta Software Consulting va rog sa comentati:

Probleme aparute la partitionare/instalare distributie Linux.

Care manager il utilizati mai mult si vi se pare mai flexibil?

Este necesar sa mai cunoastem comenzi referitoare la fisiere daca avem aceste managere?

Modul 6: Procese. Comenzi referitoare la procese

Procese

Comenzi pentru gestiunea proceselor

Rularea in foreground/ background

Alte informatii

Aplicatii

6.1 Procese

Notiunea de proces

Cum am vazut, Unix este un sistem de operare multitasking, ceea ce inseamna ca mai multe procese se pot executa in paralel.

Procesul este un concept fundamental in Unix.

Un proces 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 process ID. Acesta este un numar natural, diferit de 0, prin care se identifica in mod unic procesele; PID este indexul in tabela proceselor.

Fiecare proces are de asemenea si un PPID - parent PID, identificatorul procesului parinte.

Procesele sunt de doua tipuri:

procese utilizator si

procese nucleu.

Sa urmarim ce procese se executa la incarcarea sistemului de operare Unix:

Se initializeaza structurile de date proprii ale nucleului.

Se monteaza sistemul de fisiere.

Se creaza procesul 0, numit scheduler, care este planificatorul de procese. Procesul scheduler 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.

Exercitiu: Dati comenzi more, file, head pentru fisierele sistem de mai sus, pentru a vedea ce informatii contin

Caracteristicile unui proces

Dupa cum aminteam ceva mai inainte, un proces utilizator poate sa se execute in mod utilizator si in mod nucleu. La executia in mod utilizator procesele au acces doar la propria zona de cod, date si stiva utilizator. In mod 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. 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 cedeaza procesorul fiului printr-un apel al functiei wait si intra in starea de asteptare;

Procesul fiu lanseaza un apel exec prin care executa un nou program. Nucleul incarca in zona de memorie a shell-ului noul program, iar procesul este continuat cu acest program, caruia ii sunt transmise argumentele;

La incheierea executiei programului se apeleaza functia sistem exit, care determina terminarea procesului fiu si reda controlul procesului parinte (acesta iese din starea de asteptare); Dupa terminarea sa, procesul fiu intra in starea zombie: desi s-a terminat, numai procesul parinte poate elimina procesul fiu din tabela proceselor.

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

Aloca o noua intrare in tabela proceselor;

Asociaza un descriptor unic procesului fiu;

Realizeaza o copie logica a imaginii memoriei parintelui;

Comunica parintelui descriptorul de proces al fiului;

Trece procesul fiu in starea intrerupt (in memorie sau evacuat pe disc);

In Unix exista mecanisme prin care se realizeaza sincronizarea proceselor, folosindu-se mai multe tipuri de semnale ce pot fi schimbate intre procese. Mai jos va fi prezentata comanda kill.

Starile posibile ale proceselor si evenimentele care produc trecerea dintr-o stare in alta, pot fi urmarite in figura de mai jos. Comanda ps, prezentata in paragraful urmator permite afisarea starii proceselor, una dintre informatii fiind starea.

6.2 Comenzi pentru gestiunea proceselor

ps [optiuni] [(proces)]

Comanda ps - process status - de monitorizare a proceselor, afiseaza informatii despre procesele active ale utilizatorului sau despre toate procesele din sistem. Specificarea argumentelor proces se face prin PID-ul proceselor.

Informatiile afisate cuprind:

identificatorul utilizatorului ce a lansat procesul - UID

identificatorul procesului - PID

identificatorul parintelui - PPID

terminalul de control al procesului - TTY ( sau TT ) - se obtine valoarea afisata pentru terminal la comanda who sau who am i - verificati!

starea procesului - STAT

momentul lansarii in executie - STIME

durata procesului - TIME

comanda ce a lansat procesul - CMD.

Starea procesului STAT poate fi:

R - in executie - running

W - in asteptare - waiting

S - suspendat ( > 20 s ) - sleeping

I - suspendat ( < 20 s ) - idle

T - oprit - stopped or traced

H - intrerupt - halted

Z - terminat - zombie

Optiunile folosite cel mai des sunt:

-a toate procesele asociate cu terminalul;

-e toate procesele;

-f listare full;

-l listare informatii complete;

-n toate procesele care nu sunt asociate cu terminalul;

Modalitatea de afisare a informatiilor poate sa difere de la o versiune Unix/Linux la alta, dar in esenta sunt cele precizate mai sus.

Exemple:

ps # afiseaza PID, TTY, TIME, CMD pentru procesele interactive, detinute de utilizatorul curent

ps -e | wc -l # se afiseaza numarul tuturor proceselor active

ps --help # se afiseaza helpul comanzii - incercati si alte optiuni decat cele de mai sus!

top

Este o comanda ce afiseaza un ecran cu evolutia in timp real a proceselor celor mai prioritare din sistem. Sunt afisate statistici privind incarcarea sistemului, utilizarea procesorului, memoria utilizata, lista proceselor active.

Cu comanda man top identificati optiunile ce pot fi utilizate si testati. Observatii sunt binevenite la Software Consulting.

nice [-(prioritate)] comanda [argumente]

Lanseaza un task in paralel, avand prioritate mica - be nice cu ceilalti utilizatori. Prioritatea este un numar, numerele mari insemnand prioritate redusa. Administratorul poate lansa procese cu prioritate ridicata, chiar negativa. Prioritatile date prin nice trebuie sa fie pana la 20. Daca prioritatea nu este specificata, se incrementeaza cu 10 prioritatea implicita data de sistem.

Procesele executate cu nice, sunt executate in fundal ( background ), prin specificarea operatorului &, la sfarsitul comenzii - aceasta inseamna ca promptul va fi din nou afisat pentru introducerea urmatoarei comenzi, iar procesul lansat cu nice, ruleaza in paralel.

Se poate sa dorim ca anumite procese safie executate dupa terminarea sesiunii de lucru, daca sunt procese cu timp mare de executie ( de exemplu, efectuarea unui download ); in acest caz se specifica nohup.

nice 19 prog & # lanseaza in fundal prog, cu prioritatea minima

nice nohup prog & # executie prog dupa terminarea sesiunii de lucru

jobs

Afiseaza informatii despre procesele ce se executa in background.

Procesele ruleaza in background daca sunt lansate cu &, nice.

kill [optiuni] (pid)

Distruge procesul cu identificatorul pid. Daca forma fara optiuni nu da rezultate, se da comanda cu optiunea .

sleep (timp)

Se asteapta numarul specificat de secunde pana la afisarea din nou a promptului pentru introducerea unei noi comenzi.

sleep 5 # dupa 5 secunde se afiseaza promptul

time (comanda)

Furnizeaza timpul de executie al unei comenzi: se lanseaza in executie (comanda), iar la sfirsitul executiei se afiseaza timpul de executie si timpul sistem, in secunde.

time ls / -R # afiseaza timpul de executie pentru comanda ls

Ce ordin de marime ati obtinut?

sh (fisier)

Lanseaza in executie interpretorul Shell ( se specifica fisierul de comenzi Shell ).

6.3 Rulare in foreground/ background

Sa presupunem ca o comanda pe care vrem sa o lansam dureaza mult timp - de exemplu un download realizat prin comanda wget.

Tastati wget --help | more pentru a afla mai multe despre aceasta comanda, foarte utilizata.

Daca vrem ca pe parcursul executiei sa putem rula alte comenzi, vom executa comanda in background.

Cum facem acest lucru? Terminam linia de comanda cu operatorul &; comanda se va executa in background; dupa introducerea acestei comenzi, promptul va fi afisat, putandu-se lansa o noua comanda.

wget -q https://www.iosn.net/training/end-user-manual/print/linux-userguide-all.pdf &

Cu comanda de mai sus, este descarcata o documentatie Linux, salvandu-se in directorul curent, in fisierul cu acelasi nume c si fiserul sursa. Optiunea -q ( quiet ) se refera la faptul ca nu se scriu la terminal mesaje referitoare la evolutia descarcarii.

Putem rula mai multe comenzi in background:

comanda comanda ) &

Tastand comanda ps se vor putea obtine informatii despre comenzile ce ruleaza in background; afiseaza si PID, care este necesar afi specificat pentru distrugerea procesului cu kill.

Mai jos se poate urmari lansarea in background a comenzii wget si apoi oprirea cu kill:

O comanda lansata o putem intrerupe cu CTRL/Z; promptul va fi afisat si putem introduce comenzi.

O comanda intrerupta cu CTRL/Z poate fi reluata in foreground cu

fg

sau in background cu

bg

Urmariti intreruperea cu CTRL/Z a lui wget lansat normal, in foreground; apoi reluarea cu fg, intreruperea cu CTRL/Z si reluarea in backgroud cu bg:

Mai jos se poate urmari faptul ca la rularea in background prin intermediul comenzii nice, procesul wget are o prioritate mai scazuta, valoarea prioritatii crescand cu 10. La rularea normala este 75, iar cu nice este 85:

Retinem deci ca procesele ruleaza in background daca sunt lansate cu &, nice.

Intrerupte cu CTRL/Z, pot fi reluate in foreground cu fg, respectiv in background cu bg.

6.4 Alte resurse

Process Management - Unix Environments

The Linux Documentation Project

6.5 Aplicatii

Va rog sa testati cat mai multe dintre comenzi.

Neclaritati, comentarii, completari, se vor scrie la Discutii despre procese.

Modul 7: Comenzi referitoare la utilizatori. Configurare Shell

Notiunea de utilizator

Comenzi referitoare la utilizatori

Configurare Shell

Alte informatii

Aplicatii

7.1 Notiunea de utilizator

Un utilizator reprezinta o entitate care poate accesa resursele SO functie de drepturile pe care le are, sa execute sau detine fisiere.

Utilizatorii pot fi persoane reale sau utilizatori logici. Cei din urma sunt rezervati pentru anumite aplicatii, care efectueaza activitati specifice - de exemplu utilizatorul apache folosit de serverul httpd.

Asa cum am vazut, pentru admiterea unui utilizator in sistem, pentru a intra in sesiune de lucru, el trebuie sa fie inregistrat in fisierul de conturi /etc/passwd si sa execute o secventa de actiuni de intrare - login.

Fiecare utilizator are un nume de utilizator - username si un identificator - User ID sau UID, utilizat intern de sistem.

Pe baza numelui, sistemul determina drepturile de acces ale utilizatorului si valideaza sau inhiba actiunile sale, punand astfel in practica protectia. Orice incercare a utilizatorului de a depasi limitele protectiei stabilite de sistem este sanctionata cu un mesaj de eroare transmis de sistem, comanda nefiind executata. Astfel, incercarea de a scrie intr-un fisier pentru care utilizatorul nu are drept de scriere provoaca transmiterea unui mesaj Permission denied, actiunea nefiind executata.

Sistemul permite ca: un acelasi utilizator sa lucreze simultan la mai multe terminale sau ca utilizatori diferiti sa foloseasca acelasi cont - acelasi nume si aceeasi parola de intrare.

In fisierul /etc/passwd, fiecare utilizator are asociate trei campuri de informatii:

campul infomativ - numele real

directorul home - de obicei /home/nume_utilizator

interpreterul de comenzi ce se lanseaza implicit

Putem afisa linia din /etc/passwd referitoare la un utilizator cu:

cat /etc/passwd | egrep nume_utilizator

Home directory-ul propriu, una dintre informatiile liniei, este afisata si de comenzile:

echo $HOME

sau

echo ~

Utilizatorii sunt organizati in grupuri, fiecare grup avand un identificator propriu Group ID sau GID, utilizat de SO.

Informatiile despre grupuri sunt stocate in fisierul /etc/group. O linie din acest fisier incepe cu numele grupului, apoi sunt enumerati utilizatorii ce fac parte din grup. Un utilizator poate face parte din mai multe grupuri.

cat /etc/group | egrep nume_utilizator

afiseaza informatiile din fisier cu grupurile din care face parte utilizatorul precizat.

Din cate grupuri face parte utilizatorul? Imi spune comanda:

cat /etc/group | egrep nume_utilizator | wc -l

Parolele utilizatorilor sunt memorate criptat in fisierul /etc/shadow.

Sa 'spionam' putin dand comanda:

cat /etc/shadow

Ce observati?

Exista un utilizator privilegiat al sitemului, numit root, al carui identificator UID este zero. Acesta are drepturi totale, poate controla executia programelor, manipula orice fisiere, crea/actualiza conturi de utilizatori.

Sa aflam informatiile despre root cu comanda:

cat /etc/passwd | egrep root

Am discutat despre cateva comenzi referitoare la utilizatori in modulele anterioare, cand am enumerat cele mai utilizate comenzi.

Pentru avea o imagine completa, le vom relua mai jos, completandu-le cu altele noi.

7.2 Comenzi referitoare la utilizatori

passwd

Modifica parola, operand in /etc/shadow. Este recomandat ca parola sa se schimbe periodic si sa aiba un numar de cel putin 6 caractere.

whoami

Afiseaza username-ul utilizatorului curent:

who

Afiseaza utilizatorii care sunt in sesiune de lucru, pentru fiecare se precizeaza numele, terminalul asociat, momentul intrarii in sesiune.

who | wc -l # numara utilizatorii activi

who -m # are acelasi efect ca whoami

who am i # ca mai sus; oricare doua argumente echivaleaza cu -m

w

Se afiseaza utilizatorii care sunt in sesiune de lucru si procesele lor active ( se poate deci vedea ce lucreaza fiecare ).

id [ utilizator ]

Afiseaza UID, GID si numele utilizator si de grup pentru utilizatorul curent sau cel precizat.

id # pentru utilizatorul curent

id root # pentru root

finger [ utilizator ]

Afiseaza informatii despre utilizatorii activi sau despre cel precizat: numele, ultima intrare in sistem.

finger # informatii despre utilizatorii activi

finger apache # despre utilizatorul logic apache

In cazul in care se precizeaza un utilizator, ultima informatie afisata de finger este continutul fisierul .plan din home directory-ul utilizatorului respectiv; daca un astfel de fisier nu exista, se afiseaza No plan.

Sa urmarim in figura de mai jos informatiile afisate de finger si construirea fisierului .plan ce este apoi afisat implicit de finger:

Construiti-va fisierul .plan

Sa observam informatia Idle, afisata de finger fara parametri - se refera la timpul neutilizat; este afisat, functie de durata efectiva, in minute sau ore si minute sau numar de zile.

last [ utilizator ]

Afisarea de informatii despre sesiunile de lucru ale tuturor utilizatorilor, respectiv ale utilizatorului specificat: IP de unde s-a intrat, momentele intre care a durat sesiunea.

last | more # fiind multi utilizatori, afisarea o fac pe pagini ( pipe cu more )

su [ optiune ] [ utilizator ]

Comanda prin care utilizatorul curent se substituie cu altul. Se va solicita parola noului utilizator.

De cele mai multe ori comanda e folosita de root pentru a rezolva diferite probleme ale utilizatorilor.

su # implicit se trece in root

su utilizator # cu optiunea actiunea de substituire este similara cu cea de conectare.

7.3 Configurare Shell

Tipuri de Shell-uri

Shell-ul , ne mai amintim, da?, reprezinta interfata dintre utilizator si kernel. La intrarea in sesiunea de lucru, implicit se lanseaza shell-ul corespunzator configurarii utilizatorului, cel indicat in /etc/passwd, pe linia cu informatiile utilizatorului.

Care este shell-ul ce-l folosim?

Il aflam cu comenzile:

cat /etc/passwd | egrep utilizator

sau

echo $SHELL # o variabila Shell ce o vom lamuri putin mai jos

De obicei pentru Unix, shell-ul implicit este Bourne Shell - /bin/sh, iar pentru Linux este bash -

/bin/bash.

Ce alte shell-uri sunt disponibile?

Le gasim printre fisierele executabile gasite cu comanda:

ls -l /bin/*sh* # fisiere ce au sh in nume, situate in /bin

Verificati faptul ca apar listate in fisierul /etc/shells cu:

cat /etc/shells

Ce shell-uri ati gasit?

Cele mai cunoscute Shell-uri sunt prezentate mai jos:

sh

Bourne shell - foarte utilizat; poate fi instalat si ca fisier executabil bsh

ksh

Korn shell - derivat din Bourne shell, adaugare history si editare linia de comanda

csh

C shell - bazat pe limbajul C

bash

Born Again shell - sub Linux

tcsh

Version C shell cu editare interactiva linia de comanda

Variabile Shell

Shell-ul - interpretorul de comenzi - ofera un mecanism de definire a unor variabile, numite variabile shell, utilizate implicit de unele programe sau de utilizator.

Exista variabile predefinite, iar utilizatorul isi poate defini noi variabile.

Variabilele predefinite au numele scris cu majuscule, iar pentru a obtine valoarea unei variabile, numele este precedat de caracterul .

Mai jos sunt prezentate cele mai uzuale variabile shell:

Variabila

Descriere

Observatii

HOME

home directory

setare automata la login, cu informatia din /usr/passwd

LOGNAME

numele utilizator

setare automata la login

MAIL

fisierul care contine mesajele

utilizat de shell pentru notificarea asupra mesajelor noi

OSTYPE

versiunea SO ( pentru Linux )

setare automata

PATH

lista de directoare in care se cauta comenzile

setare automata la login

PS1

promptul principal

poate fi reconfigurata

PS2

promptul secundar

poate fi reconfigurata

SHELL

fisierul shell

setare automata la login

TERM

tipul terminalului

poate fi reconfigurata

TZ

time zone

setata de sistem

Comanda

echo $HOME

permite afisarea valorii variabilei HOME.

Ce se intampla daca incercam sa afisam o variabila nedefinita: echo $NEDEFINITA ?

Afisarea tuturor variabilelor se face cu comanda:

set

Tastati

set | more

pentru a putea observa toate variabilele.

Setarea unei variabile se face cu

variabila definitie

De exemplu

PS1='comanda:'

schimba promptul principal cu sirul precizat.

Ce este promptul secundar? O comanda mai lunga poate fi introdusa pe mai multe linii - multiline command, terminand linia curenta cu blackslash . Dupa un se va afisa promptul secundar, cel principal fiind afisat din nou la terminarea introducerii comenzii.

Dati

PS2='noua linie comanda:', apoi introduceti o comanda multilinie:

ls

-lR |

more

Dati din nou

set | more si observati schimbarea, vizibila de altfel si prin modificarea efectiva a promptului.

Pot fi definite si variabile noi.

Exemplu:

Pentru tema 1, ati creat un director Tema1, iar in acesta Carti si Autori.

De exemplu, se poate defini o variabila DIRC care sa contina calea directorului Carti, utilizarea acestei variabile ar scurta unele comenzi:

DIRC=$HOME/Tema1/Carti

Dati set | more si observati ca a aparut noua variabila.

Cu set | egrep DIRC veti afisa doar noua definitie.

echo 'Ai definit DIRC='$DIRC # afiseaza numele variabilei si apoi valoarea sa

Afisarea continutului fisierului Luceafarul se poate face acum cu:

cat $DIRC/Luceafarul # pentru precizarea valorii variabilei, a nu se uita din fata numelui variabilei

Se poate face curent directorul Carti cu:

cd $DIRC

Observatie: Nu e necesar ca numele unei variabile ce se defineste sa fie format doar din majuscule.

Variabilele shell modificate sau definite de utilizator se pastreaza doar pe perioada sesiunii curente.

Daca vrem sa se pastreze aceste definitii, le scriem in fisierul de configurare .profile, din home directory, care se executa automat la intrarea in sesiune. Inainte de a se executa acest fisier din contul utilizatorului se executa /etc/profile, un fisier de configurare sistem.

Tastati cat /etc/profile si cat $HOME/.profile pentru a vedea continutul acestor fisiere.

Alias

Exista unele comenzi pe care le folosim frecvent. Daca sunt lungi, avand si optiuni, este util sa le echivalam cu un nume, folosind comanda alias.

alias nume comanda

alias lsrec='ls -Rl $HOME' # definesc aliasul lsrec pentru listarea recursiva a home directory

lsrec # va fi acum o comanda valida

alias rm='rm -i' # e utila o redefinire a comenzii de stergere, pentru a fi interactiva intotdeauna, fapt ce previne stergeri accidentale

alias # listeaza aliasurile definite; verificati daca exista aliasuri predefinite

alias nume # afiseaza definirea aliasului precizat

unalias nume # definirea aliasului este anulata

Schimbarea Shell-ului curent

Schimbarea shell-ului curent se face cu comanda chsh - change shell. Noul shell va fi curent doar dupa intrarea intr-o noua sesiune, deci dupa exit si reintrare in sesiune.

Pentru diferite versiuni Unix/Linux poate diferi sintaxa acestei comenzi:

pentru Unix:

chsh nou_shell # chsh ksh face curent Korn shell

pentru Linux:

Dupa introducerea comenzii chsh, va fi solicitata parola si calea noul shell. Administrattorul poate schimba shell-ul curent al oricarui utilizator, precizand contul pentru care sa se faca schimbarea dupa chsh.

Daca vrem doar executia tempora a unui shell, il lansam in executie:

nume_shell # de exemplu ash lanseaza acest shell

Revenirea in shell-ul curent se face cu:

exit

Serviciile ( facilitatile ) unui shell se refera la:

prelucrarea comenzilor

redirectare

mecanismul pipe

definire de variabile

procesare de scripturi.

Observam ca ultimul aspect, scrierea scripturilor ne-a mai ramas de discutat in modulele urmatoare.

7.4 Alte resurse

Variables in Shell - Linux Shell Scripting Tutorial

Shells - UNIX at Fermilab

7.5 Aplicatii

Va rog sa testati cat mai multe dintre comenzi.

Neclaritati, comentarii, completari, se vor scrie la Software Consulting.

Aplicatie:

1. Creati in home directory fisierul .plan, in care introduceti cateva linii, la alegere, cu comanda:

cat > .plan

.

CTRL/D

2. Introduceti in .profile ( adaugati, daca fisierul exista deja ) definitii pentru promptul principal si secundar:

PS1=sir1

PS2=sir2

3. Dati comanda:

. .profile dot command

pentru a se executa .profile si noile definitii sa devina active.

4. Creati un alias numit linie, care sa adauga o linie formata din 10 semne in fisierul rezultat2. ( Hint: revedeti comanda echo si redirectarea )

Rezultatele executiei comenzilor de mai jos se vor redirectiona ( prin append >> ) spre fisierul rezultat2, creat in home directory.

Rezultatele unei comenzi vor fi separate de rezultatele comenzii urmatoare prin linia creata de executia aliasului definit:

linie

5. finger nume_utilizator # numele vostru de utilizator

6. last nume_utilizator

7. Scrieti in rezultat2, pentru variabilele HOME, LOGNAME, PS1, PS2, SHELL, cate o linie de forma:

nume_variabila=valoare_variabila

8. Trimiteti rezultat2 in Conferinta Tema 2

Succes!

Modul 8: Utilitare

Utilitare care lucreaza cu expresii regulate

Unelte de diagnosticare

Manipulare fisiere text

Utilitare pentru comparare

Utilitare pentru posta electronica

Alte informatii

Aplicatii

8.1 Utilitare care lucreaza cu expresii regulate

Expresii regulate

O expresie regulata este un sablon pentru siruri de caractere. Sunt cateva caractere care au o semnificatie speciala si se numesc metacaractere. In lista sunt prezentate aceste caractere:

= orice caracter

  = caracterul care il urmeaza este tratat ca si caracter normal.

Exemplu: daca in loc de adunarea efectiva a+b se doreste scrierea textului se va folosi a + b

  = sablonul se aplica la inceputul liniei

  = sablonul se aplica la sfarsitul liniei

Exemple: inseamna o linie formata din exact 3 caractere; inseamna linie ce incepe cu caracterul punct

lista   = se va folosi unul din caracterele din lista.

Exemplu: [a-d] se folosesc caracterele: a,b,c sau d

lista   = se va folosi orice caracter in afara de cele din lista

  = se folosesc in expresiile regulate

Exemplu:

e+  = sir de caractere format din unul sau mai multe caractere e
e*  = sir de caractere format din unul sau mai multe caractere e sau sirul vid
e?  = sir vid sau sir format dintr-un sir reprezentat de expresia e
(e)  = sir reprezentat de expresia e
e1 e2  = concatenare siruri reprezentate de expresiile e1 si e2
e1|e2  = sir format din sirurile reprezentate de expresia e1 sau e2

Expresiile regulate se pot incadra intre ghilimele sau apostrofuri. In varianta cu apostrofuri, metacaracterele nu sunt luate in considerare.

echo '$SHELL$PWD' # se afiseaza valorile celor doua variabile shell, separate prin caracterul

echo '$SHELL$PWD' # se afiseaza sirul dintre apostrofuri, deci $SHELLt$PWD

Pentru a cauta siruri de caractere, multe comenzi permit realizarea intr-un mod mai complex prin folosirea expresiilor regulate.

Comanda grep

Comanda este folosita pentru cautarea unui tipar intr-un fisier sau in mai multe fisiere intr-un mod rapid si flexibil. Numele provine de la comanda g/regular_expression/p adica global regular expression printer. Utilitarul poate fi utilizat in urmatoarea forma:

grep [lista de optiuni] [expresie regulata] [lista de fisiere]

Fara optiuni va cauta toate liniile care contin siruri descrise de expresia regulata din fisierele date.

-c  = afiseaza numarul de linii care contin sirul descris prin expresia regulata
-v  = afiseaza liniile care nu contin siruri descrise prin expresia regulata
-i  = nu tine cont de litere mari si mici
-n  = afiseaza liniile care contin sirurile descrise de expresia regulata, precedate de numarul liniei
-l  = afiseaza lista de fisiere care au in continutul lor siruri descrise de expresia regulata
-f  = sirul de caractere care il urmeaza reprezinta numele unui fisier care contine expresii regulate pe fiecare linie, astfel incat se pot lucra cu mai multe expresii regulate

Exemple:

Presupunem ca fisierul telefon.txt contine liniile:

Sorin Marin:2201987
Marin Pop:7765770
Sorin Amariucai:1213453
Sorina Marineasa:2345321
Maria Popescu:2233114
Ion Sorinca:4560432

Urmatoarele comenzi afiseaza:

grep Sorin telefon.txt  # afiseaza liniile care contin sirul Sorin, deci 1 3 4 6

grep -n Sorin telefon.txt  # afiseaza liniile care contin sirul Sorin, precedate de numarul liniei

grep -c Sorin telefon.txt # sau

grep Sorin telefon.txt | wc -l  # afiseaza numarul de linii care contin sirul Sorin, deci 4

grep '^Sorin' telefon.txt  # afiseaza liniile in care Sorin este radacina prenumelui, deci 1 3 4

grep '^Sorin' telefon.txt  # afiseaza liniile in care Sorin este prenume, deci 1 3

grep -vi mari telefon.txt  # afiseaza liniile care nu contin sirul mari, nefacand distinctie intre literele mari si mici, deci linia 6

grep ' P' telefon.txt  # afiseaza liniile cu persoanele a caror nume de familie incepe cu P, deci liniile 2 5

Va rog sa editati fisierul telefon.txt si sa verificati comenzile din exemplu.

Cum scrieti comanda care afiseaza liniile pentru persoanele cu numele de familie Marin?

Dar cea pentru numerele de telefon care se termina cu ? Sau pentru numerele ce contin ?

Cum afisez doar fisierele ordinare din directorul curent? Stiu ca la afisarea cu ls, linia corespunzatoare unui astfel de fisier incepe cu ; deci listez doar liniile ce incep cu , cu comanda:

ls -l | grep ^-

Cum afisez doar directoarele, cum le numar?

Observatiile sunt binevenite la Software Consulting.

Comanda fgrep

Comanda permite o cautare rapida folosind siruri de caractere dintr-un fisier. Este similara cu grep -f

Comanda egrep

Comanda permite o cautare complexa, folosind mai multe tipuri de tipare decat comenzile precedente, dar ruleaza mult mai incet. Este similara cu grep -e

Putem acum intelege mai bine exemplele date in modulele anterioare in care aparea comanda grep sau egrep:

Putem afisa linia din /etc/passwd referitoare la un utilizator cu:

cat /etc/passwd | egrep nume_utilizator

Comanda sed

Numele provine de la stream editor; editarea se face prin precizarea unor comenzi, nu in mod interactiv; comenzile se aplica asupra fiecarei linii din fisierul de prelucrat.

Este folosit pentru realizarea unor transformari de baza asupra fisierelor text.

In linia de comanda se introduce operatia care se doreste a fi realizata de sed sau fisierul care contine operatiile dorite.

sed [-n] [-e] comanda fisiere

sed [-n] -f fisier_comenzi fisiere

-n  = suprima iesirea ( afisarea la fisierul standard de iesire )
-e  = arata ca urmatorul argument este o comanda. Se foloseste in cazul in care apar mai multe comenzi in aceeasi linie
-f  = arata ca urmatorul argument este un fisier ce contine comenzile dorite

Comenzile sunt:

s/  =substitutie unui sir cu un alt sir
d   =pentru stergerea liniilor dorite
a  =adaugare sir dupa o linie
i  =inserare sir  inaintea unei linii

Informatii complete despre comanda se obtin cu comanda:

info sed

Cea mai utilizata comanda este substitutia:

sed s/sir_cautat/sir_inlocuitor/[fanion]
unde fanion poate fi:

g = inlocuieste toate aparitiile sirului cautat (global) 
n = inlocuieste a n-a aparitie a sirului cautat
p  =tipareste linia in care s-a produs inlocuirea

Exemplu

sed 's/^Ion /Sandu /' telefon.txt > copie.txt # creeaza copie.txt in care prenumele Ion, gasit doar in ultima linie, devine Sandu

Fisierul copie.txt va contine liniile:

cat copie.txt

Sorin Marin:2201987
Marin Pop:7765770
Sorin Amariucai:1213453
Sorina Marineasa:2345321
Maria Popescu:2233114
Sandu Sorinca:4560432

sed s/S/N/ copie.txt # inlocuieste primul S din fiecare linie cu N; pe ecran se va afisa:

Norin Marin:2201987
Marin Pop:7765770
N orin Amariucai:1213453
N orina Marineasa:2345321
Maria Popescu:2233114
Nandu Sorinca:4560432

sed s/S/N/g copie.txt # inlocuieste toate aparitiile S din fiecare linie cu N; pe ecran se va afisa ( deosebirea fata de mai sus apare la ultima linie):

Norin Marin:2201987
Marin Pop:7765770
N orin Amariucai:1213453
N orina Marineasa:2345321
Maria Popescu:2233114
Nandu Norinca:4560432

Dar daca dorim ca toate numarele de telefon ce incep cu sa inceapa cu ? Comanda ce afiseaza noul continut pe ecran este:

sed s/:2/:5/ copie.txt

Comanda tr

Numele comenzii vine de la translate. Utilitarul permite inlocuirea unui sir de caractere cu un alt sir de caractere sau stergerea caracterelor din sir1, daca se precizeaza optiunea -d si sir2 nu e precizat.

tr [optiuni] [sir1[sir2]]

Nu primeste argumente, ci intrarea si iesirea sunt cele standard; daca vrem sa precizam fisiere, se folosese redirectarea.

Exemple: pentru a schimba caracterele mari cu cele mici intr-un fisier se foloseste comanda tr astfel:

tr [A-Z] [a-z] <fisier_intrare >fisier_iesire

Fisierul copie2.txt va contine nume scrise doar cu litere mici:

tr [A-Z] [a-z] <telefon.txt >copie2.txt

cat copie2.txt

sorin marin:2201987
marin pop:7765770
sorin amariucai:1213453
sorina marineasa:2345321
maria popescu:2233114
ion sorinca:4560432

tr -d : <telefon.txt # elimina

Sorin Marin2201987
Marin Pop7765770
Sorin Amariucai1213453
Sorina Marineasa2345321
Maria Popescu2233114
Ion Sorinca4560432

tr -d ': ' <telefon.txt # elimina si blancurile

SorinMarin2201987
MarinPop7765770
SorinAmariucai1213453
SorinaMarineasa2345321
MariaPopescu2233114
IonSorinca4560432

tr : 'n' <telefon.txt # inlocuieste cu linie noua, deci numele si numerele apar pe linii diferite

Sorin Marin
2201987
Marin Pop
7765770
Sorin Amariucai
1213453
Sorina Marineasa
2345321
Maria Popescu
2233114
Ion Sorinca
4560432

echo $PATH | tr : 'n' # afiseaza fiecare cale din PATH pe cate o linie noua - verificati!

8.2 Unelte de diagnosticare

Comanda od

Sunt situatii in care chiar daca se stie exact ce contine un fisier si cum este structurat ( de exemplu pentru un text scris in coloane se stie cate tab-uri si linii noi s-au folosit ) totusi fisierul nu arata asa cum ar trebui ( de exemplu coloanele nu sunt aliniate corespunzator ). De aceea este necesara depistarea caracterelor netiparibile.

Numele comenzii vine de la octal dump. Utilitarul permite afisarea fiecarui caracter din fisier in format octal octal sau alte formate in functie de optiunile care se vor da in linia de comanda:

od [optiuni] [fisiere]

optiunile cele mai utilizate sunt:
-o  = afiseaza in format octal (implicit)
-x = afisare in format hexazecimal
-c  = afisare caracterelor cu corespondent grafic si a caracterelor speciale sub forma: =null, b=backspace, f=form feed, n=new line, r=carriage return, t=tab; este util a se combina aceasta optiune cu celelalte

Prima coloana afisata reprezinta adresele din fisier de unde se incep afisarile liniilor respective.

Exemple:

od telefon.txt # afiseaza continutul fisierului in octal

od -x telefon.txt # afiseaza continutul fisierului in hexazecimal

od -cx telefon.txt # pentru fiecare caracter se specifica si forma hex

ls | od -c # util pentru a vedea daca exista nume de fisiere care contin caractere netiparibile - verificati!

Comanda script

Sunt multe situatii in care se doreste pastrarea informatiilor care au aparut intr-o consola, de exemplu ce comenzi s-au dat si ce rezultate au aparut in urma executiei lor.

Sunt vizibile doar ultimele rezultate, cele mai vechi se pierd, lucru care se observa atunci cand se da scroll in sus in fereastra consolei.

Comanda script permite salvarea intr-un fisier a tuturor informatiilor dat intr-o anumita consola. Implicit acest fisier se numeste typescript.

Folosind optiunea -a, informatiile vor fi adauga la sfarsitul unui fisier dorit.

Inregistrarea porneste in momentul in care se porneste acest utilitar si se opreste atunci cand consola a fost inchisa sau cand se da comanda exit. Fisierul contine si momentul cand a inceput crearea sa si cel cand s-a incheiat.

Exemplu:

Comenzile de mai jos produc fisierul typescript care va contine tot ce a fost afisat pe ecran intre script si exit:

script

ls -l | grep r-x

who am i

exit

Daca prima comanda ar fi:

script -a transcript

s-ar crea fisierul transcript.

Observatie: Comanda history recunoscuta de majoritatea shell-urilor, afiseaza ultimele comenzi tastate, nu si rezultatele lor.

Tastati:

history # cate comenzi se afiseaza? aflam cu:

history | wc -l

history -10 # se afiseaza ultimele 10 comenzi

history -10 > transcript # se salveaza ultimele 10 comenzi in fisierul transcript

8.3 Manipulare fisiere text

Unix poate manipula fisiere si crea noi fisiere cu continut structurat mai prietenos. Comenzile cut si paste vin in ajutorul utilizatorului. Spre deosebire de aplicatiile Office de procesare texte ( MS Word ), unde comenzile se aplica orizontal, linie cu linie ( de exemplu se copiaza trei linii, care se muta sub o alta linie de text ), in Unix utilitarele cut si paste lucreaza cu coloanele, adica se aplica vertical.

Coloanele sunt delimitate de obicei prin tab-uri.

Comanda cut

Comanda 'taie' vertical informatiile dintr-un fisier. Exista doua moduri de taiere: prin coloane folosind optiunea -c sau prin campuri folosind optiunea -f. Campurile sunt delimitate de obicei prin tab-uri dar cu ajutorul optiunii -d se pot extrage campurile delimitate prin alte caractere.

Se folosesc coloane atunci cand se doreste de exemplu afisarea primelor trei litere de la inceputul fiecarei linii de text, caz in care se foloseste:

cut -c1,2,3 telefon.txt # sau

cut -c1-3 telefon.txt # afiseaza primele trei caractere din fiecare linie

Se folosesc campuri atunci cand se doreste de exemplu extragerea prenumelor si numelor ( camp1 ) ; trebuie specificat faptul ca separatorul este , deci comanda este:

cut -d: -f1 telefon.txt

Vreau sa extrag doar numele de familie? Din iesirea comenzii anterioare extrag coloana a doua, separatorul fiind blancul:

cut -d: -f1 telefon.txt | cut -d ' ' -f2

Ne amintim comanda who care afiseaza utilizatorii care sunt in sesiune de lucru, pentru fiecare se precizeaza numele, terminalul asociat, momentul intrarii in sesiune.

Vrem sa afisam doar numele utilizatorilor, deci extragem prima coloana, separatorul fiind blancul:

who | cut -d ' ' -f1

Tranformam terminatorul de linie in prin comenzile:

who | cut -d ' ' -f1 | tr 'n' :

Comanda paste

Comanda permite rearanjarea mai multor fisiere intr-un singur fisier final prin alipirea verticala a continuturilor respective. Se foloseste de obicei impreuna cu comanda cut.

Optiunea -d permite specificarea unui alt separator, decat tab, care este implicit.

De exemplu in urma folosirii comenzii cut asupra unor fisiere se obtin coloanele dorite. Aceste fisiere se vor lipi cu comanda paste pentru a obtine un nou fisier cu toate coloanele extrase anterior.

Exemplu:

Construim un fisier care contine 6 linii, cu numerele de la 1 la 6:

cat > numar

1
2
3
4
5
6

Extragem coloana de numere de telefon din telefon.txt si alaturam liniile din numar cu aceasta coloana:

cut -d: -f2 telefon.txt > numere

paste -d ')' numar numere

Se afiseaza:

1)2201987
2)7765770
3)1213453
4)2345321
5)2233114
6)4560432

Comanda join

Ca si comanda paste, join ofera o lipire verticala. Diferenta care apare intre cele doua este modul in care se face aceasta alipire. join lucreaza intr-un mod specific bazelor de date prin folosirea campurilor comune fisierelor care se vor lipi.

Optiunea -t specifica separatorul, iar -jn m specifica ce coloana m este comuna in fisierul n.

Exemplu:

cat personal
a:nume1:1.24
b :nume2:2.56
d:nume3:3.16


cat departament
a:personal
b:educatie
c:management


join -t: personal departament
a:nume1:1.24:personal
b:nume2:2.56:educatie
d:nume3:3.16:management

Daca fisierul departament era:

cat departament
personal:a
educatie:b
management:c

, cum specificam comanda join?

Comanda sort

Comanda permite sortarea continutului unui fisier text in ordinea data de continutul liniilor sau a unor campuri din liniile fisierului.

De exemplu sortarea: 3, 145, Ab, aab, Z duce la urmatoarea forma: 145, 3, A, Z, aab deoarece sortarea se face in functie de codurile ASCII ( cifrele sunt urmate de literele mari si abia apoi de literele mici ).

Optiunile cele mai folosite sunt:
-r  = sortare descendenta
-o = urmat de nume fisier salveaza rezultatul in fisierul dorit
  = urmat de numar permite sortarea dupa un alt camp decat primul. Campurile sunt delimitate prin spatii albe, iar numerotarea incepe de la zero, asa incat al doilea camp apare ca +1
  = campul unde se opreste sortarea, se foloseste impreuna cu
-t  = specifica separatorul dintre campuri ( daca se foloseste altul decat spatiul )

Exemplu:

sort -t: +1 telefon.txt sorteaza dupa al doilea camp, deci numarul de telefon

Comanda date

Este o comanda folosita pentru afisarea unei date si ore intr-o anumita forma.

Fara parametri se afiseaza ziua si ora curente:

date

Se poate specifica un format de tiparire:

date '+ Astazi este: %d/%m/%y. O zi buna!'

, ce are ca rezultat:

Astazi 13/12/04. O zi buna!

Forma se introduce intre apostrofuri si se incepe cu caracterul
Caracterul urmat de anumite litere ex: y=year, m=month, d=day, H=hour, M=minute reprezinta campul unde se va tipari informatia specificata.

8.4 Utilitare pentru comparare

Apar frecvent situatii in care un document are mai multe versiuni, facute pentru diferite scopuri, sau create si editate de mai multe persoane. De aceea este necesar ca la un moment dat sa se compare aceste versiuni pentru a sti care este versiunea dorita.

Comanda cmp

Determina daca doua fisiere sunt sau nu identice.

cmp [optiuni] fisier1 fisier2

Comanda preia doua fisiere asupra carora se face compararea si tipareste un cod de iesire:

0 - identice

1 - diferite

2 - inaccesibile.

Optiuni:

-l - sunt listate toate diferentele: pozitie si valori in octal

-s - nu se tipareste decat valoarea finala ( work silently ).

Fara optiuni se tipareste prima diferenta gasita.

Tastati si observati ce se obtine pentru:

cmp telefon.txt copie.txt

Includeti pe rand optiunile -l si -s.

Comanda diff

Este cea mai complexa comanda pentru comparare. Comanda preia doua argumente reprezentand doua fisiere, iar compararea se face linie cu linie astfel:
1) primul fisier este baza de comparare cu cel de-al doilea
2) se compara o linie din primul fisier cu linia echivalenta din al doilea fisier

Exista trei tipuri de diferente care se pot vizualiza: stergeri - d, adaugari - a, schimbari - c. Primul fisier are liniile precedate de simbolul <, iar al doilea de >.

Comanda dircmp

Comanda determina daca doua directoare au structura identica. Sintaxa este:

dircmp dir1 dir2

Daca apar diferente la nivel de subdirectoare sau fisiere, ele sunt afisate.

8.5 Utilitare pentru posta electronica

Exista trei tipuri de programe:

de transport ( MTA - mail transport agents ) ex: sendmail

de livrare ( MDA - mail delivery agents ) ex: sendmail si procmail si

de interactiune cu utilizatorul ( MUA - mail user agents ) ex: pine, mail, mozilla mail, evolution.

Programul pine

Este un utilitar pentru citirea, scrierea si manipularea de e-mail-uri intr-o interfata in mod text. Denumirea este una recursiva si vine de la: Pine Is Not Elm unde Elm este un alt utilitar MUA. Fiind in mod text poate fi pornit de pe calculatorul dorit prin ssh sau telnet.

Se lanseaza cu:

pine

Interfata este structurata in trei zone: bara de titlu in care sunt afisate informatii legate de numarul de mailuri, zona principala in care apar meniuri si in care se pot manipula e-mailurile si zona cu bara de stare care afiseaza combinatiile de taste pentru anumite comenzi corespunzatoare diferitelor situatii (ex: ^T = adica CTRL+T pentru AddressBook).

Prin meniuri se poate naviga cu tastele directionale sau cu tastele corespunzatoare fiecarei optiuni ex: c pentru Compose message.

Pentru crearea de e-mailuri se intra in Compose Message. In dreptul campului To: se poate apasa CTRL+T pentru Address Book, iar in campul Attchmnt se poate apasa tot CTRL+T  (vezi  bara de stare) pentru gasirea unui fisier dorit. Pentru  expediere se apasa CTRL+ X.

Pentru a citi mailuri se intra in Folder List, apoi Inbox. Cu tastele directionale se parcurge lista iar cu Enter se selecteaza spre vizualizare e-maiul dorit.

A fost dezvoltat de University of Washington.

Programul Mozilla Mail

Face parte din suita Mozilla formata dintr-un browser web, un program de creare pagini web si programul pentru manipularea e-mailurilor. Aceasta suita a aparut in momentul in care firma Netscape a facut disponibile sursele suitei Netscape. Intre timp Netscape a incetat dezvoltarea suitei sale, reluata insa foarte de curand. Organizatia Mozilla a continuat sa dezvolte suita, care a ramas aproape identica ca aspect cu cea a lui Netscape - vezi ultima versiune Firefox.

Avantajele folosirii acestei suite sunt: versiunile atat pentru Linux cat si pentru Windows, iar majoritatea firmelor de ISP (Internet Service Provider) ofera informatii detaliate legate de modul de instalare, configurare si folosire a acestei suite.

Programul ofera o interfata prietenoasa cu utilizatorul, iar ca structura este asemanator cu programul Microsoft Outlook Express.

Programul Evolution

Programul poate fi considerat o clona Microsoft Outlook datorita interfetei cu utilizatorul si a optiunilor foarte asemanatoare cu programul mentionat. Pe langa functiile necesare lucrului cu e-mailuri, programul vine si cu calendar pentru programarea diverselor intruniri, o agenda pentru diferitele sarcini si cu o agenda in care sa se inregistreze informatii de contact cu persoanele dorite.

Prezentare la Novell Linux Desktop Products.

8.6 Alte resurse

Streams and sed

Unix Tools

Mail Clients

8.7 Aplicatii

Va rog sa testati cat mai multe dintre comenzi.

Neclaritati legate de material sau tema, comentarii, completari, se vor scrie la Software Consulting.

Tema:

Am discutat de mai multe ori pana acum despre fisierele /etc/passwd si /etc/group - vezi Modulul Utilizatori, care pastreaza informatii despre utilizatorii si grupurile din sistem.

Vom incerca sa realizam cateva prelucrari pornind de la aceste fisiere.

Comenzile corespunzatoare ( nu si rezultatul lor ) va rog sa le trimiteti in Conferinta Tema3.

1. Se creeaza in home directory, subdirectorul Tema3.

2. Tema3 devine curent.

3. Se listeaza continutul fisierului /etc/passwd.

4. Se listeaza continutul fisierului /etc/group.

5. Se creeaza fisierul users, care contine prima coloana din /etc/passwd ( vezi cut ).

6. Se creeaza fisierul groups, care contine prima coloana din /etc/group ( vezi cut ).

7. Se creeaza fisierul usersm, care contine liniile din users ce incep cu litera mica ( vezi grep ).

8. Se creeaza fisierul groupsm, care contine liniile din groups ce incep cu litera mica ( vezi grep ).

9. Se creeaza fisierul final, prin alipirea usersm si groupsm, caracterul separator fiind ( vezi paste ).

10. Se creeaza fisierul finalM din final, prin transformarea tuturor literelor mici in mari ( vezi tr ).

11. Se sorteaza finalM dupa coloana a doua, obtinandu-se finalS ( vezi sort ).

Succes!

Modul 9: UNIX/Linux de vacanta

Scriu felicitari

Ascult muzica, vizionez filme

Caut fisiere ( multimedia )

Vreau si jocuri

Alte informatii

Aplicatii

9.1 Scriu felicitari

Pana acum am creat fisierele prin adaugarea unor linii tastate in fisierul standard de intrare:

cat > fisier

..

CTRL/D

Sa vedem cateva editoare care ne permit crearea de documente mai complexe. Avem doar atat de multe felicitari de trimis familiei si prietenilor :-)

Editare in mod grafic

Functie de managerul de ferestre, putem folosi ca editoare:

KEdit Kate KWrite - pentru KDE

GEdit - pentru Gnome

Editoare in mod text

Cele mai utilizate sunt:

emacs

creat de Richard Stallman in 1985

in emacs se pot edita fisiere, dar si compila, executa, depana programe, citi e-mailuri

se lucreaza cu combinatii de chei, dintre care prima este CTRL sau ALT ( respectiv Esc pentru lucrul de la distanta, cu telnet

lista de comenzi la Quick Guide sau Tutorial Stanford

are o varianta grafica - XEMACS

mcedit

este editorul din managerul de fisiere mc

se lanseaza cu comanda mcedit sau din mc, cu tasta F4

comenzile sunt afisate intr-o bara de help

pico

este un editor simplu, utilizat implicit de pine

are comenzile afisate in partea de jos a ecranului

joe

editor ce foloseste combinatiile de taste ale vechiului WordStar ( la mijlocul anilor '80 il foloseam si eu sub sistemele de operare CP/M si MS-DOS

inrudite cu joe, sunt jstar si jpico

vi

editor foarte flexibil si puternic, dar care necesita exercitiu in a-l stapani

prima implementare a fost la Universitatea Berkeley, in anii '80

lucreaza in modul comanda si inserare

permite cautari/inlocuiri de siruri

lista de comenzi la vi editor

Editoare specializate

LaTeX

creat de Leslie Lamport

pentru editarea documentelor stiintifice

permite formatari, inserare de ecuatii matematice, figuri, realizarea de tabele

separa formatarea de continut

vezi tutorial si prezentare la Wikipedia

Editoare HTML

din aceasta categorie fac parte Bluefish, Quanta, Screem, Anjuta, Nvu.

Suite de birou

OpenOffice

este un pachet de programe - office suite, realizat si distribuit free de Sun, asemanator Microsoft Office

cuprinde programe pentru:

o                    procesare texte - Writer

o                    calcul tabelar - Calc

o                    prezentari - Impress

o                    prelucrare imagini - Draw

disponibil in limba romana la https://ro.openoffice.org.

KOffice

KOffice este un pachet dezvoltat sub egida KDE

contine programe pentru:

o                    procesare texte - KWord

o                    calcul tabelar - KSpread

o                    prezentari - KPresenter

o                    grafice - KChart

este disponibil si in limba romana - https://www.ro.kde.org.

La pagina Membri veti gasi adresele de e-mail ale colegilor.
Daca editati o felicitare, nu uitati sa le-o trimiteti, atasata unui mesaj:-)
Despre utilitare pentru posta electronica, am vorbit in modulul trecut.

9.2 Ascult muzica, vizionez filme

Linux a tinut pasul cu Windows in ceea ce priveste utilitarele de redare/prelucrare audio/video.

Pentru inregistrari audio sunt disponibile in prezent doua formate deschise eficiente:

Ogg Vorbis - foloseste o tehnica asemanatoare MP3, elimininand sunetele ce nu pot fi detectate de catre urechea umana

FLAC - comprima datele fara a pierde nimic.

Mai jos este apare o lista de astfel de utilitare:

Grip - aplicatie pentru Gnome scrisa de Mike Oliphant - https://www.nostatic.org/grip; este un utilitar CD player, avand si facilitati de a converti fisiere audio in formatul MP3

Lame - pentru conversie MP3 - https://lame.sourceforge.net

XMMS - X MultiMedia System - aplicatie asemanatoare Winamp - https://www.xmms.org

mpg123 - aplicatie petru audiere MP3 din linia de comanda - https://www.mpg123.org

cdplay - utilitar pentru audiere CD; xplaycd este varianta grafica

Noatun - KDE Media Player pentru formate WAV, MP3, OggVorbis, MPEG-1, DivX - https://noatun.kde.org; similar este MPlayer - https://www.mplayerhq.hu.

9.3 Caut fisiere ( multimedia )

Una dintre comenzile cele mai complexe este find, ce permite localizarea de fisiere ce indeplinesc anumite criterii si efectuarea unor operatii asupra acestora.

Comanda permite furnizarea mai multor directoare de cautare si a mai multor conditii:

find (director) (conditie)

Cautarea se face recursiv dintr-un director precizat.

Cele mai utilizate conditii sunt:

-atime +n ¦ -n | n

fisiere ce au fost accesate cu mai mult de n zile inainte, respectiv cu mai putin sau exact n zile;

-ctime +n ¦ -n | n

similar cu -atime, dar se cauta fisiere ce au fost modificate

-exec comanda ;

se executa asupra fiecarui fisier gasit comanda precizata

-ls

informatiile despre fisierele gasite sunt tiparite similar comenzii ls -lids

-name pattern

numele fisierelor trebuie sa corespunda tiparului precizat

-print

tipareste informatiile despre fisierele gasite - de obicei conditia este implicita

-size n[c]

cauta fisiere cu dimensiunea de n blocuri ( un bloc are de obicei 512 ko ); daca si c e precizat, dimensiunea se considera in octeti

-type c

fisierele cautate sa fie de tipul c, care poate fi:

o                    b - fisiere bloc

o                    c - fisiere caracter

o                    d - director

o                    f - fisier ordinar

o                    l - legatura simbolica

o                    p - pipe

o                    s - socket

-user user

fisierele sa apartina utilizatorului precizat

Exemple:

find $HOME -print # listeaza toate fisierele din directorul curent, parcurs recursiv; verificati daca absenta conditiei duce la acelasi rezultat; observati diferenta acestei comenzi fata de ls $HOME; folositi inlantuirea cu | more pentru a lista pe pagini

find / -user root | wc -l # este afisat numarul de fisiere ce apartin utilizatorului root, din tot sistemul de fisiere; ce observati la rularea comenzii?

find $HOME -name '.*' | more # afiseaza fisierele hidden ale utilizatorului ( a caror nume incepe cu )

find $HOME -type d -atime -7 | more # afiseaza subdirectoarele accesate in ultima saptamana

find $HOME -type d -atime -7 -exec ls ; | more # afiseaza continutul subdirectoarele accesate in ultima saptamana

find $HOME -size 0 -exec rm -i ; # sunt sterse fisierele vide, pentru fiecare cerandu-se confirmarea

find . -exec grep -l 'unix' '' ; # sunt afisate numele fisierelor ce contin cuvantul unix, pornind cautarea din directorul curent

find . name '*.wav' >> catalog # numele fisierelor wav din directorul curent, parcurs recursiv, sunt adaugate in fisierul catalog

Cum scrieti comanda ce afiseaza numele fisierelor cu extensia .txt, ce contin cuvantul Craciun, au fost create in ultimele 3 zile si se gasesc in contul utilizatorului?

9.4 Vreau si jocuri

Desigur ati remarcat deja in distribuitia Linux pe care ati instalat-o, faptul ca fiecare manager de fisiere vine cu un set de jocuri.

The Linux Gamers' HOWTO clasifica jocurile in tipurile:

Arcade style

Card, logic and board games

Text Adventure (aka Interactive Fiction)

Graphical Adventures

Simulation (aka Sims)

Strategy (aka Strats)

First Person Shooter (aka FPS)

Side Scrollers

Third Person Shooters

Role Playing Game (aka RPG)

Ca site-uri pentru jocuri:

Games la ibiblio

Linux Game Demos and Downloads

Linux Games

HappyPenguin

9.5 Alte resurse

Linux la birou - editoare

Unix is a four letter word

Doing Things in GNU/Linux

Audio/Video Software List

Linux On Your Desktop: Multimedia

Linux Art and Design Resources

The Linux Gamers' HOWTO

9.6 Aplicatii

Incercati sa testati cat mai multe dintre comenzi.

Neclaritati legate de material, comentarii, completari, se vor scrie la Software Consulting

Modul 10: Programare Shell

Executia unui script

Argumentele liniei de comanda

Variabile de proces

Substitutie de variabila

Comenzi de I/E pentru shell

Comenzi pentru programarea shell

Exemple

Alte informatii

Aplicatii

10.1 Executia unui script

Scopul acestui modul este familiarizarea cu:

utilizarea argumentelor in linia de comanda

aspecte mai complexe legate de procesarea shell

notiunea de substitutie de variabila si de comanda

scrierea scripturilor

comenzi ce pot fi folosite in scrierea de scripturi.

Ce este un script?

Un script este un fisier care contine comenzi.

Un script echivaleaza cu o noua noua comanda, fiind tratat de shell la fel ca orice comanda a sistemului. Este deci mecanismul de extindere a SO.

Un script poate contine o secventa de comenzi care se executa des. Complexitatea scripturilor este data de posibilitatea de a utiliza anumite structuri de control, ce vor fi prezentate mai jos si care sunt asemanatoare celor din limbajele de programare cunoscute. Vorbim in aceasta situatie despre programare shell.

Sa construim scriptul contorfis care contine liniile:

echo 'numar fisiere ordinare in directorul curent:c'
ls -l | grep ^- | wc -l

Cele doua comenzi afiseaza numarul de fisiere ordinare din directorul curent: la listarea in format lung - ls, sunt selectate liniile corespunzatoare fisierelor ordinare, care au primul caracter minus - grep, care sunt numarate - wc.

Cum editam fisierul? Fie folosim un editor dintre cele prezentate in modulul anterior, fie redirectam intrarea standard

cat > contorfis

si dupa introducerea celor doua linii, tastam CTRL/D.

Executia scripturilor

Cum putem executa acest script?

1. ca argument al shell-ului

shell script

Se creeaza un subshell care executa scriptul, variabilele shellului curent nefiind modificate.

Exemplu:

Executia scriptului de mai sus, s-ar face specificand shellul sub care sa fie rulat cu:

sh contorfis

sau

bash contorfis

2. fisier executabil

Cu comanda

chmod +x script

dam drept de executie.

Executia scriptului se va face atunci:

script

sau

./script # numele este precedat de cale, aici directorul curent

In aceasta situatie, scriptul este executat de shellul curent.

Executam scriptul nostru cu:

chmod +x contorfis
./contorfis

3. dot command - comanda punct

. script

Scriptul este executat de un subshell. A se observa ca este necesar un spatiu intre punct si numele scriptului. In aceasta situatie scriptul nu trebuie facut executabil.

Executam scriptul nostru cu:

. contorfis

4. utilizare paranteze rotunde ( )

( comenzi )

Uneori se doreste ca un sir de comenzi, despartite prin sa produca un singur rezultat. Comenzile pot fi introduse intre paranteze rotunde, fiind executate de un subshell.

Sa urmarim exemplul de mai jos. Presupunem ca executia este precedata de crearea unui subdirector in cel curent:

mkdir subdir

Se tasteaza comenzile:

( cd subdir ; ls -l ) > listsubdir

Cele doua comenzi dintre se executa intr-un subshell. Dupa executia lor, directorul curent nu se modifica, deci fisierul listsubdir va fi creat in directorul curent, continand rezultatul listarii directorului subdir.

5. utilizare acolade

In cazul in care comenzile se introduc intre acolade, sunt executate de shellul curent.

Tastand:

> listsubdir

,directorul curent se modifica, devenind subdir; fisierul listsubdir va fi creat in acest director, continand rezultatul listarii sale.

10.2 Argumentele liniei de comanda

Dupa cum stiti, o linie de comanda are trei elemente:

comanda

optiuni

argumente

Vom vedea in continuare variabile shell utilizate pentru accesarea, prelucrarea argumentelor, foarte importante si des utilizate in scrierea scripturilor.

Valorile argumentelor

Chiar daca linia de comanda are mai multe argumente, doar primele 9 sunt pot fi accesate la un moment dat. Parcurgerea lor in continuare, presupune utilizarea comenzii shift.

Numarul argumentelor

Este dat de valoarea .

Linia de comanda

furnizeaza sirul tuturor argumentelor.

10.3 Variabile de proces

Numarul de proces

Numarul procesului curent este dat de valoarea . Ne amintim ca numerele proceselor active le putem afisa cu comanda ps.

In multe scripturi care lucreaza cu fisiere temporare, spre a fi unice, in numele lor se introduce , deci numarul ( unic ) al procesului activ. La sfarsitul scriptului, acestea se pot sterge cu o singura comanda:

rm *$$*

Valoarea de retur a unui proces

Valoarea cu care s-a incheiat comanda, procesul anterior este . Valoarea 0 inseamna terminare cu succes, iar o valoare diferita de 0, inseamna terminare cu eroare.

cd / ; echo $?

Afisarea valorii 0 inseamna ca directorul curent a devenit directorul radacina; o alta valoare inseamna ca nu s-a putut face radacina director curent.

Sa vedem un mic exemplu pentru a ilustra elementele prezentate in aceste doua paragrafe.

Sa cream urmatorul script - test1 - care contine liniile urmatoare:

echo 'Am fost lansat cu comanda: $0'

echo 'Am primit $# argumente; argument1: $1, argument2: $2'

echo 'Argumentele au fost: $*'

echo 'Sunt procesul cu numarul: $$'

Executati test1 cu dot command apoi dati comanda echo:

. test1 ultim modul la cursul UNIX

echo 'test1 terminat cu codul: $?'

Faceti test1 executabil si tastati:

./test1 ultim modul la cursul UNIX

echo 'test1 terminat cu codul: $?'

Ce diferente ati observat?

Dar daca dati doar un argument?

Un mesaj la Software Consulting este binevenit.

10.4 Substitutie de variabila

Este o tehnica utilizata atunci cand este necesar pentru executia corecta a unui script ca o variabila shell sa aiba o valoare asignata.

Substitutie temporara

Din exemplul de mai jos se observa constructia care asigneaza o valoare unei variabile pentru o singura data:

echo $MYVAR # variabila MYVAR nu are o valoare, deci se va tipari sirul vid

echo $ # se asigneaza o valoare temporara myvalue
echo $MYVAR
# din nou se va tipari sirul vid

Substitutie permanenta

Exemplul de mai sus in care folosim substitutia permanenta va duce la:

echo $MYVAR # variabila MYVAR nu are o valoare, deci se va tipari sirul vid

echo $ # se asigneaza o valoare permanenta myvalue
echo $MYVAR
# din nou se va tipari sirul vid
myvalue

Observati ce se intampla daca in secventele de mai sus, adaugati ca prima comanda:

MYVAR='valoare initiala' # variabila MYVAR se initializeaza

Mesaj de eroare si substitutie

Utilizatorul este avertizat daca variabila nu este asignata:

echo $ # se tipareste mesaj de avertizare daca MYVAR nu e initializata Nici o valoare

10.5 Comenzi de I/E pentru shell

Comanda echo

echo sir

Cunoastem deja aceasta comanda, pe care am utilizat-o des. Stim ca sirul ce constituie parametrul comenzii se afiseaza pe ecran si apoi se trece la randul urmator. Daca sirul se include intre ghilimele, poate contine secvente escape, variabile shell.

Exemplu:

echo 'valoarea variabilei SHELL :c'

echo 'este: $SHELL'

Secventa escape c inseamna ramanerea cursorului dupa ultimul caracter afisat ( nu se trece la randul urmator ).

Document here

Atunci cand trebuie afisate pe ecran mai multe linii, pentru a nu avea un sir de comenzi echo, se poate utiliza un document here. Aceasta inseamna linii incluse intre etichetele:

<<ETICHETA

ETICHETA

Atentie: Cea de-a doua, trebuie sa apara la inceput de linie.

Exemplu:

cat <<versuri

Cobori in jos Luceafar bland,

   Alunecand pe-o raza.

versuri

Comanda read

Se utilizeaza pentru citirea valorii unei variabile shell.

read variabila

Exemplu:

echo 'Tastati valoarea variabilei NUMAR:'

read NUMAR

echo 'NUMAR a primit valoarea $NUMAR'

Shellul Korn permite scrierea comprimata a unui mesaj inaintea citirii unei variabile si a citirii propriu-zise, cu:

read NUMAR?'Tastati valoarea variabilei NUMAR:c' # verificati in shell-ul curent

Comanda banner

banner sir

Scrie sirul marit de 6 ori.

Tastati banner unix si observati efectul.

10.6 Comenzi pentru programarea shell

Conditii

In cazul in care conditia este o expresie relationala, poate fi data in una din variantele:

[ 14 -gt 10 ] # de notat spatiul dupa , respectiv inainte de

[[ 14 >= 10 ]] # utilizare operatori relationali aritmetici pentru Bourne Shell, intre si

test 14 -gt 10

Sa observam modul in care se scriu operatorii relationali:

-eq pentru

-ne pentru != n ( diferit )

-gt pentru >

-ge pentru >=

-lt pentru <

-le pentru <=

Exista de asemenea o serie de operatori pentru fisiere:

-a fisier - fisierul exista

-d fisier - fisierul exista si este director

-f fisier - fisierul exista si este fisier ordinar

-r fisier - fisierul exista si poate fi citit

-s fisier - fisierul exista si nu este vid

-w fisier - fisierul exista si poate fi scris

-x fisier - fisierul exista si este executabil.

Mai jos sunt prezentati operatorii pentru siruri:

-n sir - sirul nu este vid

-z sir - sirul este vid

sir1 sir2 - sirurile sunt identice

sir1 sir2 - sirurile sunt diferite

sir1 < sir2 - primul sir il precede alfabetic pe al doilea

sir1 > sir2 - primul sir il succede alfabetic pe al doilea.

Operatorii logici sunt: && ( si ) , ( sau ), ( not ).

Comanda if

if conditie

then

comenzi1

else

comenzi2

fi

Daca nu se doreste executia unor comenzi pentru cazul cand conditia este falsa, sintaxa este:

if conditie

then

comenzi

fi

Comanda case

La fel ca si instructiunea cu acelasi nume din C, case permite executia de secvente specifice diferitelor valori ale unei variabile:

case variabila in

valoare1

comenzi1

;;

# pentru orice alta valoare decat cele specificate

comenzid

;;

esac

Comanda for

for variabila in lista

do

comenzi

done

Comenzile sunt executate pentru fiecare valoare a variabilei din lista data.

Exemple:

for contor in 1 5 9

do

echo 'contor are valoarea $contor'

done

Pe ecran se tipareste:

contor are valoarea 1

contor are valoarea 5

contor are valoarea 9

Sa cream acum un fisier valori:

cat > valori

1 7

6

8 5

CTRL/D

La executia:

for contor in `cat valori` # substitutie de comanda

do

echo 'contor are valoarea $contor'

done

Pe ecran se tipareste:

contor are valoarea 1

contor are valoarea 7

contor are valoarea 6

contor are valoarea 8

contor are valoarea 5

Sa cream scriptul testfor cu liniile:

for contor

do

echo 'contor are valoarea $contor'

done

Sa executam testfor cu parametrii:

testfor Modulul 10 al cursului unix este ultimul . Urmeaza sesiunea .

Pe ecran vor apare 11 linii, corespunzatoare celor 11 parametri:

contor are valoarea Modulul

.

contor are valoarea sesiunea

contor are valoarea .

Iata o posibilitate de avea acces la un numar mai mare de parametri decat cei 9, accesibili prin .. . O alta varianta o vom urmari la comanda while.

Comanda while

while conditie

do

comenzi

done

Exemple:

Scriptul testfor il putem scrie echivalent cu while astfel:

while [ $# -lt 0 ] # cat timp numarul de parametri este mai mare decat 0

do

echo 'parametru: $1'

shift

done

Comanda shift scade cu 1 numarul de parametri, distrugandu-l pe primul si mutandu-i pe urmatorii cu o pozitie in fata.

10.7 Exemple

Exemplul 1

Sa se scrie un script care accepta orice numar de argumente. Pentru fiecare argument, sa se verifice daca este director. Daca este director sa se tipareasca numarul de fisiere ordinare pe care le contine:

Directorul valoare_argument contine numar fisiere ordinare

Daca nu este director sa se tipareasca:

valoare_argument nu este director

Sa se tipareasca un mesaj de eroare, daca nu se furnizeaza nici un argument.

Sa retinem: La scrierea scripturilor, foarte importante sunt comentariile - linii care incep cu - care fac mai clar scriptul atat pentru autor, cand va trebui sa-l mai modifice, cat si bineinteles pentru cei care il vor utiliza/testa.

Sa vedem acum rezolvarea:

# infodir afiseaza numarul de fisiere ordinare din argumentele care reprezinta directoare

# mesaj de eroare si iesire daca nu se da nici un argument

if test $# -eq 0

then

echo '*** eroare: nici un parametru ***'

exit 1

fi

# prelucrare fiecare parametru

for argument

do

if test -d $argument

then

numar=`ls -l $argument | grep ^- | wc -l`

echo 'directorul $argument contine $numar fisiere ordinare'

else

echo '$argument nu este director'

fi

done

Salvati liniile intr-un fisier pe care numiti-l de exemplu infodir.

Faceti fisierul executabil si dati apoi comanda:

./infodir . .. ~ $HOME ../$HOME / none

S-a executat corect? Observatii sunt binevenite la Software Consulting.

Putem scrie echivalent scriptul de mai sus, folosind while, astfel:

Linia for argument o inlocuim cu:

while [ $# -lt 0 ] # cat timp numarul de parametri este mai mare decat 0

Dupa do dam variabilei argument valoarea primul parametru:

argument=$1

Inainte de done apare o comanda shift.

Testati si noua varianta.

Exemplul 2

Urmatorul script accepta un singur argument. Daca argumentul este un director, listeaza continutul subdirectorului din acesta, avand numele cel mai lung.

# verificare un argument; altfel iesire

if [ $# -ne 1 ]

then

echo 'Eroare: trebuie un argument'
exit 1

fi

# daca argumentul este director, este prelucrat

if test -d $1

then

subdirectories=`ls -p -1 $1 | grep '/$'` # variabila subdirectories va contine numele tuturor subdirectoarelor
if [ -z $subdirectories ] # nici un subdirector

then

echo 'Nici un subdirector in $1'

else

# numarare caractere din numele fiecarui subdirector, stabilirea celui mai lung
longest_name=''; max_length=0

for name in $subdirectories
do

length=`echo $name | wc -m` # numara caractere
if [ $length -gt $max_length ]

then
longest_name=$name; max_length=$length

fi

done

echo 'Subdirectroul cu cel mai lung nume este $longest_name'
echo 'Intrarile sale sunt:'
ls -l $1/$longest_name | more

fi

else

echo 'Parametrul $1 nu este director'

fi

Exemplul 3

Acest script implementeaza o carte de telefon. Cartea de telefon este un fisier, al carui nume se trimite scriptului ca parametru.

Fiecare linie din cartea de telefon contine informatiile:

nume:prenume:nickname:numar

Scriptul este interactiv si realizeaza operatiile de informare, actualizare, stergere, listare.

Dupa executie, noua forma a cartii de telefon se gaseste in fisierul asg51out.

10.8 Alte resurse

Unix Bourne Shell Scripting

Linux Shell Scripting Tutorial

10.9 Aplicatii

Va rog sa testati cat mai multe dintre comenzi.

Neclaritati legate de material sau tema, comentarii, completari, se vor scrie la Software Consulting.

Tema:

Modificati scriptul infodir, astfel incat sa afiseze numarul de subdirectoare din fiecare director argument. Trimiteti liniile scriptului in Conferinta Tema4.

Succes!





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate