Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
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
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
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.
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
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.
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
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.
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
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 ( 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.
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.
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:
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.
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
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.
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.
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
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.
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
Linux / Unix / Computing Glossary
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.
Sistemul de fisiere
Structura generala de directoare
Alte informatii
Aplicatii
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.
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.
Exista trei tipuri de fisiere fizice:
fisiere ordinare
fisiere director
fisiere speciale
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.
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.
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.
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
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:
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.
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+
umount fisier-special
sau
umount director
, unde director este numele directorului in care a fost montat sistemul de fisiere.
On-line UNIX manual pages
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.
Interpretarea comenzilor
Comenzi pentru gestiunea directoarelor
Comenzi pentru gestiunea fisierelor
Comenzi informative si pentru terminale
Alte informatii
Aplicatii
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 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.
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.
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!
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*
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 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.
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
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:
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
Commonly used Unix commands
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!
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.
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.
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.
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.
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:
IOSN - User Guide to Using the Linux Desktop
IOSN - User Guide to Using the Linux Desktop - Interactive (Beta 1)
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?
Procese
Comenzi pentru gestiunea proceselor
Rularea in foreground/ background
Alte informatii
Aplicatii
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
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.
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 ).
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.
Process Management - Unix Environments
The Linux Documentation Project
Va rog sa testati cat mai multe dintre comenzi.
Neclaritati, comentarii, completari, se vor scrie la Discutii despre procese.
Notiunea de utilizator
Comenzi referitoare la utilizatori
Configurare Shell
Alte informatii
Aplicatii
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.
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.
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 |
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 |
|
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.
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 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.
Variables in Shell - Linux Shell Scripting Tutorial
Shells - UNIX at Fermilab
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!
Utilitare care lucreaza cu expresii regulate
Unelte de diagnosticare
Manipulare fisiere text
Utilitare pentru comparare
Utilitare pentru posta electronica
Alte informatii
Aplicatii
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 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 permite o cautare rapida folosind siruri de caractere dintr-un fisier. Este similara cu grep -f
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
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
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!
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!
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
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 '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 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
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 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
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.
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.
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.
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 determina daca doua directoare au structura identica. Sintaxa este:
dircmp dir1 dir2
Daca apar diferente la nivel de subdirectoare sau fisiere, ele sunt afisate.
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.
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.
Face parte din
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 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.
Streams and sed
Unix Tools
Mail Clients
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!
Scriu felicitari
Ascult muzica, vizionez filme
Caut fisiere ( multimedia )
Vreau si jocuri
Alte informatii
Aplicatii
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 :-)
Functie de managerul de ferestre, putem folosi ca editoare:
KEdit Kate KWrite - pentru KDE
GEdit - pentru Gnome
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
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.
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.
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.
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
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?
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:
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:
Linux Game Demos and Downloads
HappyPenguin
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
Incercati sa testati cat mai multe dintre comenzi.
Neclaritati legate de material, comentarii, completari, se vor scrie la Software Consulting
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
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.
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.
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.
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.
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.
Este dat de valoarea .
furnizeaza sirul tuturor argumentelor.
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 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.
Este o tehnica utilizata atunci cand este necesar pentru executia corecta a unui script ca o variabila shell sa aiba o valoare asignata.
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
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
Utilizatorul este avertizat daca variabila nu este asignata:
echo $ # se tipareste mesaj de avertizare daca MYVAR nu e initializata Nici o valoare
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 ).
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
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
banner sir
Scrie sirul marit de 6 ori.
Tastati banner unix si observati efectul.
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 ).
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
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
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.
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.
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.
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
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.
Unix Bourne Shell Scripting
Linux Shell Scripting Tutorial
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!
Copyright © 2024 - Toate drepturile rezervate