Sunteți pe pagina 1din 197

Cuvnt nainte Avnd o istorie de peste 30 de ani, sistemul de operare UNIX s-a impus pe piaa sistemelor de operare de reea

ca un sistem robust, fiabil, portabil, capabil s ruleze pe cele mai variate arhitecturi hardware. Conform opiniilor specialitilor n domeniu, UNIX reprezint sistemul de operare original. De fapt, Microsoft Windows i MacOS (sistemul de operare ce ruleaz pe Macintosh) au fost iniial dezvoltate ca alternative la UNIX i nu invers. Cu toate c majoritatea PC-urilor actuale utilizeaz Windows, n ultimul timp se observ o tendin din ce n ce mai puternic spre utilizarea Linux-ului (care nu este altceva dect o variant de UNIX) care are un mare avantaj: este gratis! De asemenea, ultimele tipuri de interfee grafice precum CDE (Common Desktop Environment), GNOME, KDE faciliteaz folosirea UNIX-ului pentru utilizatorii care nu sunt specialiti n domeniul calculatoarelor. Pe de alt parte, cunotinele legate de UNIX pot reprezenta o avere deosebit n lumea de astzi a tehnologiei informaiei. Multe dintre cele mai puternice reele din lume i site-uri Internet sunt bazate pe UNIX, existnd o cerere deosebit pentru profesioniti specializai n administrarea sistemelor UNIX. Aceti administratori de sisteme (cunoscui i sub denumirea de sysadmin) sunt printre cei mai bine pltii oameni din domeniul IT. n primul capitol al lucrrii de fa sunt prezentate caracteristicile generale ale sistemului de operare UNIX, istoric, tipuri de implementri, documentare, comenzi i interfee grafice. n capitolul al doilea sunt prezentate noiuni legate de sistemul de fiiere UNIX precum i comenzi referitoare la fiiere i directoare. Capitolul al treilea se refer la administrarea fiierelor, comenzi legate de partiii i hard-disc-uri, cutarea i sortarea fiierelor, arhivarea i compresia fiierelor. n capitolul al patrulea sunt prezentate serviciile de reea oferite n UNIX, serviciile ARPA precum i posibilitatea integrrii cu alte sisteme de operare. Capitolul al cincilea face referire la editoare de texte utilizate pe sisteme UNIX; sunt prezentate aici editorul vi i editorul pico. n capitolul al aselea sunt prezentate noiuni generale legate de shell-uri UNIX, variante, procese UNIX i mediul de lucru.

Capitolele apte i opt se refer la variantele Bourne Shell (sh), respectiv Bourne Again Shell (bash). Aici sunt prezentate: gramatica Shell, tipuri de operatori, mediul Shell, comenzi, funcii, toate acestea nsoite de numeroase exemple. Obiectivul urmrit prin scrierea acestei lucrri a fost acela de a face o introducere n lumea UNIX prezentnd caracteristicile fundamentale i facilitile acestui sistem de operare precum i acela de a oferi numeroase exemple de utilizare a programelor de tip shell-script, cu accent pe shell-ul Bourne i shell-ul Bourne Again. Lucrarea se adreseaz n special studenilor ce studiaz sistemul de operare UNIX n cadrul activitilor de curs, seminar sau laborator, iar exemplele prezentate n carte constituie o bogat surs de inspiraie pentru acetia. Autorul

UNIX CARACTERISTICI GENERALE

1.1 Introducere Sistemul de operare UNIX, mpreun cu suita de protocoale TCP/IP pentru comunicaia n reea i cu sistemul de fiiere NFS constituie o soluie convenabil pentru constituirea unui sistem complet de operare n reea. Dezvoltat iniial n laboratoarele AT&T Bell Labs (cu participarea companiei General Electric i a faimosului MIT Massachusetts Institute of Technology), UNIX-ul reprezint, de fapt, o mare familie de sisteme de operare nrudite ce descind din munca programatorilor Dennis Ritchie i Ken Thompson (creatorii limbajului C) la sfritul anilor 60 i nceputul anilor 70. Sistemele din familia UNIX pot fi rulate pe orice tip de calculator, plecnd de la calculatoarele personale pn la super-calculatoarele cu configuraii extrem de avansate, utilizate ndeosebi n domeniul militar i cel bancar. De asemenea, toate variantele de UNIX sunt multitasking, domeniu n care UNIX are o reputaie deosebit. Numele su deriv de la un jos de cuvinte al unui alt proiect Bell Labs/MIT din acelai timp produs pe un calculator mainframe cunoscut sub numele de Multics (Multiplexed Information and Computing Service). Sistemul de operare interactiv Multics fusese scris pentru un computer al companiei General Electric dovedindu-se dup ani de dezvoltare mult prea costisitor, de aceea Bell Labs s-a retras ulterior din proiect. n timpul lucrului la proiectul Multics, programatorul Ken Thompson a scris un joc de cltorie n spaiu pentru computerul General Electric. Dup sistarea proiectului, acesta a rescris jocul mpreun

Prin multitasking se nelege capacitatea unui sistem de operare de a executa mai multe procese (task-uri) simultan. Acest lucru se realizeaz prin fenomenul time slicing ce presupune c fiecare proces aflat n execuie utilizeaz calculatorul pentru o perioad determinat de timp. Comportamentul multitasking este n opoziie cu task switching, caz n care fiecare proces aflat n execuie trebuie s se termine pentru a se ncepe execuia unui nou proces.

UNIX

cu colegul su Dennis Ritchie pentru a rula pe un computer DEC PDP-7 ce avea un display grafic mai performant. Acest calculator avea nevoie ns de un sistem de operare viabil. Iniial, noul sistem de operare a fost numit de ctre Thompson UNICS (Uniplexed Information and Computing Service), apoi numele su s-a schimbat n UNIX iar jocul de cltorie spaial a fost modificat pentru a rula sub UNIX. Cu toate mbuntirile aduse de-a lungul timpurilor, de la primele implementri de UNIX i pn acum, toate variaiile sale urmresc ntr-o mare msur arhitectura i funcionalitatea original UNIX. 1.2 Scurt istoric Pentru a nelege mai bine caracteristicile acestui sistem de operare, avantajele i dezavantajele sale, este util s cunoatem cteva lucruri legate de istoria sa. Dup cum am spus mai nainte, UNIX a fost conceput iniial la Bell Laboratories USA drept un proiect privat de cercetare, proiect nceput n 1969 de ctre un mic colectiv de cercettori. Scopul acestui colectiv de cercetare era acela de a concepe un sistem de operare care s corespund urmtoarelor exigene: s fie elegant, simplu i concis; s fie scris ntr-un limbaj de programare de nivel nalt i nu n limbaj de asamblare; s permit refolosirea codului. La nceput, UNIX a fost scris n limbaj de asamblare i de aceea nu putea rula dect pe un calculator anume. Odat cu naterea limbajului C n 1971, Ritchie i Thompson au rescris n 1973 programele de sistem UNIX n C. n acest fel UNIX-ul putea fi mutat (portat) i pe alte calculatoare fr un efort prea mare de programare. n aceeai perioad, compania AT&T (firm mam pentru Bell Laboratories) a fost declarat monopol de Comisia Federal de Comer a SUA. Drept compensaie, Bell Laboratories a oferit gratis sistemul de operare UNIX universitilor din SUA, astfel nct acesta a devenit extrem de popular n mediul academic. Cu timpul, UNIX s-a rspndit i n mediul comercial, n care studenii aplicau ceea ce au nvat pe bncile universitilor. Spre deosebire de majoritatea productorilor de sisteme de operare din acel timp, care produceau sisteme mari i scrise n limbaj de asamblare, UNIX avea un mic procent de cod scris n limbaj de asamblare (aproximativ 10% - kernelul), n timp ce restul codului era scris n C. Grupul de dezvoltare a sistemului a conceput iniial munca n limbaj de nivel nalt,

UNIX Caracteristici generale

apoi, odat cu dezvoltarea sa, au aprut mici schimbri ce au fost fcute n kernel i n limbajul de programare pentru a se definitiva UNIX-ul. n cadrul acestei evoluii continue, kernelul i software-ul aferent au fost extinse pn cnd s-a creat un sistem de operare scris n C, bazat pe kernelul n limbaj de asamblare. Codul surs al sistemului de operare UNIX a fost fcut public i disponibil universitilor de pe ntreg teritoriul SUA. Programatorii de la Universitatea Berkeley din California au fcut modificri substaniale codului surs original i astfel s-a nscut BSD (Berkeley Software Distribution) UNIX. Aceast nou versiune de UNIX a fost fcut cunoscut la rndul ei programatorilor din SUA care au adugat instrumente i cod. Cea mai important mbuntire adus sistemului de operare de ctre programatorii de la Berkeley a fost adugarea software-ului de reea ce a permis sistemului de operare s funcioneze ntr-o reea local. Varianta BSD UNIX a devenit extrem de popular printre productorii de computere, dintre care: Hewlett Packard, Digital Equipment Corporation i Sun Microsystems. Scurt istoric al sistemului de operare UNIX
Tabelul 1.1
1969 nceputul dezvoltrii a ceea ce urma s devin UNIX de ctre programatorii Ken Thompson i Dennis Ritchie la Bell Laboratories. 1973 UNIX este rescris n C pentru a fi portabil i a putea rula pe diverse computere. 1975 Se distribuie versiunea 6 n afara laboratoarelor Bell; prima versiune BSD deriv din aceast versiune V6. 1980 Microsoft produce Xenix iar BSD 4.2 este larg utilizat. 1984 Universitatea Berkeley din California distribuie versiunea 4.2 BSD ce include suita de protocoale TCP/IP pentru reea i alte programe aplicative. 1984 Apare versiunea SVR2 (System V Release 2); exist aproximativ 100.000 de instalri de UNIX n ntreaga lume. 1986 Apare versiunea 4.3BSD ce include internet name server. 1987 Apare versiunea SVR3; n acest moment exist aproximativ 750.000 de instalri de UNIX n ntreaga lume. 1988 Apare UNIX SVR4 prin unificarea versiunilor System V, BSD i Xenix. 1991 UNIX System Laboratories (USL) devine o companie n care acionar majoritar este AT&T; Linus Torvalds ncepe dezvoltarea Linux-ului. 1992 USL elaboreaz UNIX SVR4.2 iar Novell i anun intenia de a prelua USL. 1993 Apare versiunea 4.4BSD de la Berkeley. Novell preia USL. 1999 UNIX mplinete 30 de ani; kernel-ul Linux ajunge la versiunea 2.2. 2001 Versiunea 3 Single UNIX Specifications reunete eforturile POSIX, The Open Group i ale altor companii. Kernel-ul Linux ajunge la varianta 2.4 2003 Kernel-ul Linux ajunge la versiunea 2.5 2004 Se afl n lucru variante ale kernel-ului Linux versiunea 2.6

UNIX

n timp ce firma Sun Microsystems avea sistemul de operare SunOS bazat pe versiunea BSD UNIX 4.2, compania AT&T folosea o versiune de UNIX cunoscut sub numele de System V (system five). n anul 1988, SunOS/BSD, AT&T System V Release 3 i XENIX (o versiune de UNIX dezvoltat de Microsoft pentru PC-uri cu procesoare Intel) au fost combinate ntr-o nou versiune UNIX denumit System V Release 4 (SVR4). Aceast nou generaie a sistemului de operare UNIX a fost creat n scopul combinrii celor mai bune caracteristici din varianta BSD ct i din varianta AT&T System V pentru a crea un standard n industria sistemelor de operare. Acest lucru a permis dezvoltarea de software pentru UNIX indiferent c era vorba despre System V sau BSD 4.2. Noua variant SVR4 a devenit baza celor mai multe varieti de UNIX. n tabelul 1.1 regsim istoria de peste 30 de ani a sistemului de operare UNIX. 1.3 UNIX sistem de operare pentru reea Ca un vechi i adevrat sistem de operare pentru reea, UNIX ofer faciliti avansate n acest sens, printre care: Operare multi-utilizator Multitasking Procesare distribuit Nivel ridicat de securitate Facilitatea de operare multi-utilizator permite accesul simultan la sistem pentru mai muli utilizatori ce pot astfel partaja aceleai resurse ale sistemului. Sistemul de operare are grij de fiecare resurs a computerului, fie c este vorba de memoria RAM, microprocesor, hard disk, scanner sau imprimant, permind partajarea fiecreia dintre acestea. Fiecare program aflat n execuie poart numele de proces sau task. Sistemul de operare UNIX ine evidena mai multor procese simultan aceast capacitate a sa este denumit multitasking. Acest fapt permite mai multor aplicaii s ruleze n acelai timp pe computer. De asemenea, capacitatea de procesare distribuit a sistemului de operare se refer la faptul c acesta permite utilizarea partajat a resurselor n cadrul reelei. Cel mai simplu exemplu n acest sens este acela n care un utilizator poate accesa fiiere i aplicaii de pe hard disk-ul altui computer situat n alt parte a reelei de calculatoare.

10

UNIX Caracteristici generale

n fine, sistemele de operare pentru reea au implementate sisteme de securitate foarte sigure; exist multe alte faciliti de asigurare a securitii n afar de cea clasic nume-de-utilizator/parol. De regul, facilitile de asigurare a securitii sistemului pot fi active sau nu, n funcie de politicile de securitate implementate la nivelul companiei respective. 1.4 Arhitectura UNIX Sistemul de operare UNIX este un sistem de operare structurat n principal pe urmtoarele dou nivele: Programe sistem UNIX; Nucleul (denumit kernel) sistemului UNIX. Majoritatea programelor sistem i kernel sunt scrise n C, permind portabilitatea pe alte platforme hardware ce posed un compilator C. Programele de sistem UNIX ofer funcionalitatea cerut de utilizatori prin iniierea unui sistem de apeluri ctre nucleul sistemului UNIX. Nucleul ndeplinete aceste cereri interacionnd cu nivelul hardware i returnnd rezultatele scontate utilitarelor i programelor sistem. n aceast arhitectur stratificat, doar nucleul UNIX trebuie s se ocupe de echipamentele hardware specifice cu care trebuie s interacioneze; n interiorul nucleului majoritatea codului specific hardware se limiteaz la driverele echipamentelor. Nucleul reprezint centrul sistemului de operare i are rolul de a oferi funcionalitile de baz necesare funcionrii computerului. Nucleul este apropiat de microprocesor i hardware, fiind un fiier executabil ce este ncrcat n memorie atunci cnd are loc procesul de boot al calculatorului, fiind denumit generic unix (pe sistemele bazate pe System V) sau vmunix (pe sistemele bazate pe BSD). Odat cu ncrcarea n memorie, nucleul ncepe execuia urmtoarelor funcii: Administrarea echipamentelor, a memoriei i a proceselor; Asigur controlul funciilor de transmisie a informaiilor ntre programele de sistem i echipamentele hardware; Administreaz entiti precum spaiul de swap, demonii i sistemul de fiiere. Spaiul de swap reprezint o poriune special de pe hard-disc ce este folosit de ctre kernel pentru procesare. Buci ale programelor ce se afl n execuie pot fi interschimbate ntre memoria RAM i hard-disc ori de cte ori este nevoie. Acest mecanism de extindere a memoriei

11

UNIX

RAM a sistemului prin utilizarea spaiului de pe hard-disc poart denumirea de memorie virtual. Demonii sunt programe (sau procese) ce ndeplinesc un anumit rol; ei sunt procese speciale care i ncep execuia dup ncrcarea sistemului de operare n memorie. Dup aceea, demonii ateapt s ruleze anumite sarcini n sprijinul sistemului de operare, putnd fi pornii manual sau n mod automat. Un exemplu de proces demon este dtlogin care determin apariia ecranului de login CDE la nceputul unei sesiuni UNIX sau dup ce utilizatorul iese din File Manager-ul CDE. Procesele demon din lumea UNIX sunt similare cu serviciile (services) din Windows NT/2000/XP sau cu modulele NLM (Netware Loadable Modules) din sistemul de operare Novell Netware. Sistemele de fiiere reprezint modalitatea de organizare a directoarelor, subdirectoarelor, fiierelor pe hard-disc. Sistemele de fiiere pot fi situate att local (pe calculatorul local) ct i la distan (pe alt calculator din reea, de regul un aa numit server). Programele i utilitarele sistemului, precum i aplicaiile utilizatorilor sunt independente de hardware i singura cerin pentru acestea este s iniieze apeluri standardizate de sistem ctre nucleul UNIX. Cele mai multe dintre funciile nucleului UNIX se ocup de managementul fiierelor sau al anumitor tipuri de dispozitive. Pentru a simplifica i standardiza apelurile de sistem, UNIX interpreteaz echipamentele ca fiind tipuri speciale de fiiere. Poate cea mai important caracteristic a sistemului UNIX este aceea a disponibilitii codului surs, ceea ce permite multor programatori s mbunteasc i s modifice aceste sistem de operare de-a lungul anilor. Cele dou proprieti remarcabile ale sistemului de operare UNIX sunt: Portabilitatea aceasta se manifest n dou moduri: n primul rnd, UNIX este portabil pe numeroase platforme hardware; n al doilea rnd, programele scrise pentru UNIX sunt implicit portabile pe toate platformele UNIX, depinznd de nivelul de similaritate ntre nucleele i programele de sistem UNIX; Modularitatea UNIX este un sistem dinamic, a crui funcionalitate poate fi mbuntit prin adugarea de noi programe utilitare; de asemenea, este posibil i modificarea nucleului i recompilarea sa pentru un sistem de operare mai bun.

12

UNIX Caracteristici generale

Arhitectura general i cele mai importante funcii ale nucleului UNIX sunt prezentate n figura 1.2.

Figura 1.2 Arhitectura general a sistemului de operare UNIX

1.5 Funcionaliti UNIX Dintre cele mai importante caracteristici funcionale ale sistemului de operare UNIX se disting urmtoarele: Operare multiutilizator; Multitasking preemtiv; Multiprocesare; Suport pentru aplicaii multi-threaded. O alt caracteristic important este aceea a managementului memoriei care este realizat prin dou metode de baz: memoria virtual (prin procedeul de swapping) i paginarea. Prima metod permite interschimbarea proceselor ntre memoria fizic i partiia de swap de pe hard disc, n timp ce procedeul de paginare caut s elimine sau cel puin s minimizeze fragmentarea (care apare n procesul de swapping), permind astfel proceselor s execute doar acele poriuni ale acestora care sunt prezente n memoria principal. Aceste poriuni de dimensiune fix ncrcate n memoria principal la cerere sunt cunoscute sub denumirea de pagini, iar ntregul proces este referit sub numele de sistemul de memorie virtual (bazat pe cereri de pagini).

13

UNIX

Alt funcionalitate de baz este aceea oferit de sistemul de intrare/ieire care ncearc s minimizeze interaciunile (specifice hardware) necesitate de nucleul UNIX. Sistemul de intrare/ieire al sistemului de operare UNIX este alctuit din: Interfaa socket, folosit pentru comunicaiile ntre procese; Driverul dispozitivelor bloc, folosit pentru comunicarea cu dispozitive orientate pe bloc (de exemplu hard discuri sau uniti de band). Transferurile efectuate de astfel de dispozitive se fac de regul n blocuri de lungime fix de 512 sau 1024 octei; Driverul dispozitivelor orientate caracter, folosite pentru comunicarea cu dispozitivelor orientate pe caracter (terminale, imprimante sau alte dispozitive care nu transfer date n blocuri de octei de dimensiune fix). n fine, un rol de baz n funcionarea sistemului UNIX l are controlul proceselor i intercomunicarea ntre procese (asigurat prin mecanismul de conduct pipe- fie prin sockets). 1.6 Implementri de UNIX Dou dintre familiile importante ale sistemului de operare UNIX sunt: UNIX System V Release 4, cunoscut de regul sub denumirea de SVR4 sau V.4, deriv din modelul original dezvoltat la Bell Laboratories, cunoscut mai trziu sub numele de UNIX Systems Laboratory (USL) i vndut apoi ctre SCO (Santa Cruz Operation) i Berkeley Software Distribution (BSD) versiunea 4.4., variant cunoscut sub denumirea de 4.4BSD. Exist ns o mare varietate de sisteme de operare UNIX, majoritatea acestora fiind similare deoarece sunt bazate pe standardul SVR4. Celelalte varieti sunt bazate pe BSD. Cele mai multe diferene apar la comenzile de administrare a sistemului. Putem spune dac lucrm pe un sistem de operare bazat pe System V sau BSD i dup comenzile de printare (lp pentru System V i lpr pentru BSD) i de vizualizare a proceselor lansate n execuie (ps ef pentru System V i ps aux pentru BSD).

14

UNIX Caracteristici generale

UNIX a devenit o marc nregistrat (deinut de The Open Group www.opengroup.org), de aceea fiecare productor de UNIX i-a ales propriul nume. Spre exemplu, versiunea de UNIX a firmei Sun se numete Solaris, a firmei IBM se numete AIX iar a firmei Hewlett Packard se intituleaz HP-UX. n tabelul 1.3 sunt prezentate o serie de implementri UNIX, platformele hardware pe care acestea activeaz precum i vnztorii produselor. Diferite implementri de UNIX
Tabelul 1.2
Implementarea UNIX A/UX AIX HP-UX Linux NextStep OSF/1 i Ultrix SCO OpenServer Solaris UNIXWare Platforma hardware Macintosh Staii i mainframe-uri IBM, RS/6000 Staii HP RISC Intel x86 Intel 486 sau Pentium, Next Staii DEC VAX i Alpha Intel 486 sau Pentium Staii Sun Sparc i Intel x86 Intel 486 sau Pentium Vnztor Apple Computer IBM Hewlett-Packard Corporation Shareware Next Computer Digital Equipment Corporation Santa Cruz Operation SunSoft Novell

Aceste variante de UNIX sunt concepute s ruleze pe platformele hardware specifice firmelor care le-au dezvoltat. Unele variante ns ruleaz pe mai multe platforme hardware; spre exemplu, Solaris ruleaz att pe staii de lucru Sun ct i pe staii cu microprocesoare Intel i pn la computere de tip mainframe i supercomputere. Ultimul sistem de operare derivat din kernelul UNIX l reprezint Linux-ul, conceput s ruleze pe microprocesorul Intel de la staii de lucru ieftine (chiar i 386!) pn la servere performante. Linux-ul a devenit foarte popular printre specialitii entuziati ai computerelor n necesitatea gsirii unui sistem de operare stabil i ieftin.

15

UNIX

Totul a plecat n 1992 de la Linus Torvalds de la Universitatea din Helsinki, Finlanda, care a fcut public Linux-ul pe Internet i a ncurajat pe toat lumea s contribuie la dezvoltarea sa. n mod periodic un grup de dezvoltatori revizuiesc i testeaz ultimile contribuii i elaboreaz o versiune stabil a sistemulului de operare. Linux este gratis conform GNU General Public Licence (www.gnu.org) dar exist o serie de companii care adaug sistemului produse de tip Office, interfee desktop, software pentru Web server, etc. precum i CD-uri de instalare i percep astfel o tax (care este, oricum, mult mai mic dect a oricrui alt sistem de operare comercial). 1.7 GNU Not UNIX, free software i open source Conceptul de free software este un concept vechi; primele calculatoare personale au ajuns prima dat n universiti, fiind instrumente de cercetare. Software-ul putea fi instalat n mod liber pe orice calculator, iar programatorii (puini, la acea vreme) erau pltii pentru activitatea de programare, nu pentru programele n sine pe care le realizau. Ceva mai trziu ns, atunci cnd calculatoarele personale au intrat n lumea afacerilor, programatorii au nceput s restricioneze drepturile de folosire a softwareului pe care l produceau, percepnd taxe de utilizare pentru copiile programelor. Numele de GNU provine de la sintagma GNU Not UNIX i s-a dorit a fi un sistem de operare precum UNIX ce este distribuit cu codul surs i poate fi copiat, modificat i redistribuit. Proiectul GNU a fost iniiat n 1983 de Richard Stallman i alii ce au pus bazele Fundaiei pentru Software Liber (FSF Free Software Foundation). Concepia lui Stallman este aceea c utilizatorii pot face ce doresc cu software-ul achiziionat, putnd face cpii ale acestuia pentru prieteni i modifica codul surs redistribuind-ul la un anumit cost. FSF stipuleaz termenul copyleft care nseamn c oricine redistribuie software free trebuie s lase n continuare libertatea de copiere i redistribuie a programului, asigurndu-se n acest fel c nimeni nu va reclama drepturi de proprietate asupra unor versiuni viitoare i nu va impune restricii la utilizarea acestuia. n acest context, termenul free nseamn libertate i nu neaprat gratis. Fundaia FSF percepe nite costuri iniiale la distribuia GNU. Redistribuitorii pot, de asemenea, s perceap taxe pentru copiile programelor n scopul profitului sau pentru acoperirea costurilor. Ideea de baz a software-ului liber (free software) este aceea c se las libertatea

16

UNIX Caracteristici generale

utilizatorilor s modifice i s reasambleze produsul fr nici o restricie n afar de aceea c nici ei, la rndul lor, nu pot impune restricii mai departe. Stallman crede c unul dintre rezultatele filozofiei free software este acela c mai multe programe free vor coexista mpreun provenind din alte programe free. GNU este un exemplu n acest sens; acesta a devenit un sistem de operare cnd n august 1996 i-a fost adugat un kernel (GNU Hurd i Mach). Fundaia FSF continu s dezvolte software free sub form de programe de aplicaii; un program de tip spreadsheet este acum disponibil. Sistemul de operare Linux este conceput cu componente GNU iar kernelul este dezvoltat de Linus Torvalds. Munca lui Stallman a inspirat multe contribuii de software free, iar definiia open source conine multe dintre ideile lui Stallman, putnd fi considerat drept un concept derivat. Open Source Definition a luat natere odat cu distribuia Debian GNU/Linux. Sistemul de operare Debian, o variant de Linux popular i n zilele noastre, a fost construit n ntregime pe baz de software free. Cu toate acestea, deoarece avea alte licene diferite de copyleft (care era prin definiie free), Debian a avut ceva probleme n definirea faptului c este free. Cu timpul au fost elaborate o serie de reguli definite n Debian Free Software Guidelines, document ce definete practic software-ul open source. Partizan mptimit al software-ului free, Eric Raymond a scris un articol intitulat The Cathedral and the Bazaar (Catedrala i bazarul) n ncercarea de a explica ideea de free software. n acest articol, Raymond descrie software-ul comercial ca fiind dezvoltat n stilul unei catedrale, izolat de marea majoritate a dezvoltatorilor independeni, n timp de software-ul free se construiete n stil de bazar, oferind un loc de ntlnire pentru oricine dorete acest lucru. n articol se susine ideea c modelul de bazar este superior deoarece un numr mult mai mare de utilizatori i programatori contribuie la dezvoltarea de software mai bun i ntr-un timp mai scurt. Toi cei care doresc s contribuie la scrierea codului pentru proiect sunt binevenii, iar cel mai bun cod va fi ales pentru includerea n proiectul final.

GNU s-a vrut iniial s fie o alternativ la versiunile comerciale de UNIX. Acest lucru nu s-a ntmplat nc, dar Richard Stallman i ali programatori muncesc n continuare pentru acest ideal. Paradoxal este c primele succese nregistrate de GNU au fost aplicaii adiionale sistemelor proprietare UNIX. Componente GNU precum GNU Emacs, GCC (GNU C Compiler) i bash (un nlocuitor free pentru Bourne Shell) sunt instalate astzi implicit pe majoritatea variantelor de UNIX existente.

17

UNIX

Articolul The Cathedral and the Bazaar a avut un mare succes i o mare influen ulterior: oficialii de la Netscape au dezvluit codul surs al vestitului lor browser web (Netscape Navigator) n sperana c dezvoltatori independeni l vor face mai bun. Mai mult, Netscape a nceput s l consulte pe Raymond cu privire la integrarea firmei n curentul free software. La nceputul anului 1998, Eric Raymond s-a ntlnit cu o serie de susintori ai conceptului de free software pentru a discuta modaliti prin care s ncurajeze i alte companii precum Netscape s li se alture. Printre ideile vehiculate atunci, s-a stabilit c termenul free (care n englez are un sens dual, de liber, dar i de gratis) sun anti-comercial, drept pentru care au propus termenul de open source drept nlocuitor. Netscape a folosit termenul de open software atunci cnd a anunat distribuirea public a codului surs pentru Netscape Navigator iar faimoasa editur OReilly and Associates a adoptat acest termen n materialele sale promoionale. Cu ajutorul acestor dou mari firme, termenul de open source a nceput s aib mare succes. Similar cu acest concept a luat natere i ideea de open hardware cu privire la dispozitivele i interfeele hardware. Acest concept ns nu a avut acelai succes ca ideea de software open source, dar el nc exist i poate fi studiat la adresa web http://www.openhardware.org/. 1.8 Comenzi i interfee grafice n UNIX Sistemul de operare UNIX posed peste 350 de comenzi de sistem i programe utilitare folosite pentru administrarea sistemului (adugare de noi utilizatori, noi dispozitive hardware, etc.), administrarea sistemului de fiiere (creare, editare, copiere, tergere, printare, etc.), asigurarea conexiunii la reea i comunicrii cu alte sisteme i oferirea de ajutor. Interpretorul de comenzi (shell-ul) preia comenzile i le execut. Unele dintre comenzi sunt nglobate n interpretor, precum comanda cd (change directory) dar marea majoritate a comenzilor se afl pe hard-disc, de regul n directoare specifice, precum directorul bin (prescurtarea de la binary code). Toate sistemele de operare moderne au un sistem grafic de interfa cu utilizatorul (GUI Graphical User Interface); interfaa grafic Macintosh, Microsoft Windows sau UNIX CDE sunt exemple de astfel de interfee.

18

UNIX Caracteristici generale

Interfaa grafic CDE (Common Desktop Environment) Firma Sun Microsystems a fost una dintre primele firme ce a utilizat o interfa grafic pentru sistemul de operare UNIX. n anul 1993 s-a format un consoriu de firme ce comercializau sisteme de operare UNIX, cu scopul de a dezvolta un mediu de interfa grafic, integrat, standard i funcional. Printre membrii acestui consoriu se numrau: Hewlett-Packard, IBM, Novell, Sun Microsystems, companii i membri ai fundaiilor OSF (open Software Foundation), X/Open i X Consortium. CDE este bazat pe standardul Motif, oferind o serie de caracteristici generale, comune cu alte medii desktop, printre care: ofer un mediu GUI de interfa ntre utilizator i sistemul de operare; include meniuri ce pot fi selectate de ctre utilizatori i permite rularea unor programe fr a fi necesar scrierea comenzii la linia de comand; ofer peste 300 de programe utilitare i instrumente; permite utilizatorilor s controleze mai multe documente i aplicaii pe ecran n acelai timp; controleaz activitile din ferestre att cu ajutorul mouse-ului ct i cu ajutorul tastaturii. Ecranul CDE poate fi observat n figura 1.4, cu principalele programe i instrumente de lucru: calendar, administrare de fiiere, e-mail, administrarea printrii etc.

19

UNIX

Figura 1.4 Interfaa grafic CDE

Interfaa grafic GNOME O alt interfa grafic mai recent n lumea UNIX este GNU Network Object Model Environment (GNOME) i face parte din proiectul GNU open source. GNOME (vezi figura 1.5) posed un mediu grafic uor de utilizat pentru utilizator precum i un cadru propice de dezvoltare a aplicaiilor de asemenea, fiind software open source, este gratis. Interfaa GNOME (http://gnome.org) este inclus n majoritatea versiunilor de UNIX BSD precum i n distribuiile de GNU/Linux. De asemenea, GNOME funcioneaz i cu Sun Solaris (http://www.sun.com/gnome). GNOME posed o interfa intuitiv, uor de utilizat, combinnd o organizare complex a desktop-ului cu faciliti de navigare ce permit un acces uor la informaii.

20

UNIX Caracteristici generale

Figura 1.5 Interfaa grafic GNOME

1.9 Documentarea n UNIX Fie c este vorba despre un nceptor sau despre un utilizator avansat n utilizarea UNIX-ului, totdeauna este util consultarea paginilor de help (care n UNIX se numesc pagini de manual, sau man pages). Dar s vedem cum se poate obine ajutor n UNIX atunci cnd vrem s aflm cum se utilizeaz o comand ? Cea mai la ndemn soluie este consultarea paginilor de manual, acest lucru fcndu-se prin utilizarea comenzii man. A doua soluie ar fi utilizarea resurselor Internet. n continuare vom prezenta mai pe larg aceste dou opiuni.

21

UNIX

1.9.1 Utilizarea comenzii man Manualul programatorului UNIX (paginile de manual) descriu toate detaliile pe care trebuie s le cunoatem pentru a utiliza comenzi, a programa sau a administra sistemul. De regul, paginile de manual sunt instalate automat odat cu instalarea sistemului. Paginile de manual se prezint sub form de text, fr grafice, desene, etc. Pentru a accesa paginile de manual trebuie s utilizm comanda man la prompter. Paginile de manual sunt deosebit de utile fie atunci cnd am uitat sintaxa unei comenzi sau dorim informaii n plus cu privire la acea comand. Paginile de manual ofer informaii cu privire la sintaxa general a comenzii, descrierea funcionalitii acesteia, opiunile i argumentele utilizate i exemple de folosire a comenzii. Unele dintre comenzi nu vor funciona la fel n cadrul shell-urilor diferite; n acest caz se va face referire la shell-ul Bourne (sh), shell-ul Korn (ksh), shell-ul Bourne Again Shell (bash) sau shell-ul C (csh).

Figura 1.6 Listing pentru comanda man ls

22

UNIX Caracteristici generale

S vedem n continuare cteva moduri n care poate fi utilizat comanda man: Ofer informaii cu privire la o comand anume, $ man nume unde nume este denumirea complet a comenzii respective n figura 1.6 avem ca exemplu o parte din listing-ul obinut n urma apelului comenzii man ls (informaii cu privire la comanda ls). O alt posibilitate de utilizare a comenzii man este aceea n care se folosete o anumit seciune din manualul UNIX, avnd n vedere c paginile de manual sunt structurate pe mai multe seciuni. Dintre aceste seciuni, cele mai importante sunt: seciunea 1 - comenzi utilizator, seciunea 2 - apeluri de sistem, seciunea 3 - apeluri de biblioteci. Comenzile precum man(1) sunt grupate deci n seciunea 1.
$ man -s nr_sectiune nume

Ofer informaii cu privire la o comand cu numele specificat de nume, n seciunea nr_sectiune

Observaie Aceast comand poate s difere de la un sistem la altul. Modalitatea de apel prezentat mai sus se refer la Sun Solaris. Pe un sistem FreeBSD ns, comanda poate fi apelat n felul urmtor, fr a se specifica opiunea s: man nr_sectiune nume. n cazul n care nu tim numele comenzii, putem apela comanda man folosind opiunea -k, prin care facem o cutare dup un cuvnt cheie.
$ man -k cuvant_cheie

Ofer informaii cu privire la comenzi referitoare la cuvntul cheie specificat

Exemplul urmtor ne arat cum am putea cuta informaii cu privire la modificarea proprietarului (owner) unui fiier:
$ man -k owner chown(2), fchown(2), lchown(2) - change owner and group of a file chown(8) - change file owner and group $

23

UNIX

Listingul anterior conine o serie de referine care conin cuvntul cheie owner. Pe unele sisteme UNIX acest lucru se poate face utiliznd comanda apropos, ca n exemplul urmtor:
$ apropos owner chown(2), fchown(2), lchown(2) - change owner and group of a file chown(8) - change file owner and group $

De asemenea, se pot afia informaii generale n legtur cu o comand specificat folosind whatis. Comanda whatis se poate folosi astfel:
$ whatis comanda

Afieaz linia de nceput din cadrul paginii de manual referitoare la comanda specificat

Comanda whatis poate fi util n cazul n care ne reamintim comanda dar nu mai tim la ce se folosete. n mod normal, listingul obinut n urma unei comenzi man se poate ntinde pe multe pagini. n acest sens, este util s cunoatem cteva taste specifice utilizate pentru navigarea n cadrul paginilor listate pe ecran. n tabelul 1.7 sunt prezentate cteva taste folosite la navigarea prin listingul paginilor de manual. Taste utilizate pentru deplasarea n cadrul paginilor de manual
Tabelul 1.7

Tasta SPACE Tasta RETURN Tasta b Tasta f Tasta q /sir_caractere Tasta n Tasta h

Determin defilarea ecran cu ecran Determin defilarea unei singure linii de ecran napoi cu un ecran (b - back) nainte un ecran (f - forward) Se ncheie listarea i comanda man (q - quit) Se caut irul de caractere specificat Se caut urmtoarea apariie a irului de caractere (n - next) Se afieaz informaii privind posibilitile de deplasare n listing (h - help)

24

UNIX Caracteristici generale

1.9.2 Utilizarea referinelor Internet Pe Internet exist o serie ntreag de documentaii cu privire la sistemul de operare UNIX. n tabelul 1.8 sunt prezentate cteva adrese web utile ce conin astfel de documentaii. Resurse Internet pentru diverse variante de UNIX
Tabelul 1.8
URL http://www.FreeBSD.org/cgi/man.cgi http://docs.hp.com/index.html http://docs.sun.com/ http://www.ibm.com/servers/aix/ http://support.sgi.com/search/ http://doc.sco.com/ Varianta de UNIX BSD HPUX 10 & 11 SunOS, Solaris IBM AIX SGI IRIX/Linux UnixWare & SCO

Dintre aceste adrese web, prima (http://www.FreeBSD.org) merit o atenie deosebit, deoarece prezint pagini de manual i pentru alte versiuni, cum ar fi: BSD, 2.9.1 BSD, 2.10 BSD, 2.11 BSD BSD 0.0, 386BSD 0.1 BSD NET/2, 4.3BSD Reno, 4.4BSD Lite2 FreeBSD 1.0-RELEASE - FreeBSD 4.0-RELEASE FreeBSD 5.0 FreeBSD Ports Linux Slackware 3.1 Minix 2.0 NetBSD 1.2 - NetBSD 1.4 OpenBSD 2.1 - OpenBSD 2.6 Plan 9 RedHat Linux/i386 4.2, 5.0, 5.2,etc. SunOS 4.1.3, 5.5.1, 5.6, 5.7 ULTRIX 4.2 UNIX Seventh Edition

25

2
2.1

SISTEMUL DE FIIERE UNIX I COMENZI

Generaliti

Sistemul de fiiere reprezint o construcie logic ce ofer posibilitatea stocrii i regsirii informaiei ce se afl pe un dispozitiv de stocare cu acces aleator. Un sistem de fiiere este parte integrant a sistemului de operare i este format din fiiere, directoare precum i informaii necesare pentru localizarea i accesul acestora. Sistemul de fiiere UNIX ordoneaz i grupeaz din punct de vedere logic fiierele ntr-o manier eficient, prin cuprinderea acestora n directoare ce sunt asemntoare dosarelor ce conin mai multe documente. UNIX posed un sistem de fiiere ierarhic, cu o structur arborescent multi-nivel ce pleac de la directorul rdcin (root), simbolizat prin caracterul / (slash), putnd de fapt s fie suportate mai multe sisteme de fiiere simultan pe acelai disc. Fiecare disc este divizat n poriuni (partiii) ce pot gzdui un sistem de fiiere, un domeniu de swap sau un domeniu de date speciale. Directorul "root" Reprezint nivelul cel mai de sus din sistemul de fiiere i este simbolizat de caracterul "/" (slash). Nu poate exista dect un singur director root ntr-un sistem de fiiere UNIX.

n UNIX fiierele sunt interpretate sub forma unor iruri de octei; astfel, cu toate c o aplicaie face o cerere pentru un fiier cu o structur special, nucleul stocheaz acel fiier pe disc ca o simpl secven de octei, organiznd fiierele n directoare. Funcia de baz a sistemului de fiiere este aceea de a oferi servicii de fiiere aplicaiilor respective fr ca acestea s fie preocupate de structura special de stocare hardware. Un fiier reprezint un ir de octei ce aparine unui director. Conceptual, un fiier UNIX este precum un document ndosariat (dosarul este directorul din care face parte). Fiierul poate stoca informaii diverse: text, grafic, video, sunet, imagine etc. Orice fiier din sistem are un nume;

26

UNIX

lungimea numelor de fiiere UNIX este n general limitat la 255 de caractere. Caracterele valide sunt: orice caracter alfabetic, numeric, liniua de subliniere underscore ( _ ) i punctul (.). Nu se folosesc spaii n numele fiierelor, precum i urmtoarele caractere speciale: ! " ` ' ; / \ $ * & < > ( ) | { } [ ] ~. Directorul este un caz particular de fiier ce arat ca un cuprins de carte. El conine dou coloane de informaie - numerele inode ale fiierelor i numele fiierelor. Fiecare director conine o referin ctre el nsui (identificat prin semnul .) i ctre directorul printe (identificat prin ..). Chiar i directorul rdcin root conine o referin ctre directorul printe, care n acest caz este o referin ctre el nsui. Directoarele pot conine subdirectoare i fiiere. La rndul lor, subdirectoarele pot conine alte subdirectoare i alte fiiere. Orice sistem de operare posed o anumit modalitate de structur a directoarelor pentru organizarea informaiei pe hard-disc; n UNIX un director se numete directory, iar n Windows i MacOS un director se numete folder, avnd ns aceeai semnificaie. Chiar dac detaliile sistemului de fiiere pot diferi n funcie de tipul sistemului, urmtoarele componente sunt comune pentru majoritatea sistemelor de fiiere:
Blocul de boot Super-blocul Tabela de inoduri Aici se afl procedurile de boot Conine mrimea i starea sistemului de fiiere Informaiile inode (numrul total alocat, total liber, numerele inodurilor libere) O copie a acestuia se afl n memorie i una pe hard-disc Tipul i permisiuni Numrul de hard link-uri UID pentru proprietar GID pentru proprietar Dimensiunea n bytes Indicatorii dat i timp (creare, ultima accesare i ultima modificare) Adresele de bloc de pe disc Blocuri de date Fiiere obinuite - coninut Fiiere director nume de fiiere i numerele inodurilor

Blocurile de stocare

O caracteristic aparte a sistemului de fiiere UNIX o constituie legturile. O legtur (link) reprezint o posibilitate a unui fiier sau de

27

Sistemul de fiiere UNIX i comenzi

acces la acesta prin mai multe nume. O legtur este, de fapt, o intrare ntr-un director ce face redirectarea spre un fiier stocat n alt director sau chiar spre un ntreg alt director. Directorul root are o serie de subdirectoare (ce difer n funcie de implementarea UNIX), printre care cele mai importante sunt, de regul: "bin", "dev", "etc", "opt", "lib","mnt", "tmp","home" i "usr". Aceste directoare au urmtorul coninut: Comenzi UNIX Director pentru dispozitive speciale Programe i fiiere de date suplimentare Directorul bibliotecii de programe C Directorul mount; rezervat pentru montarea sistemelor de fiiere /opt Conine aa numitele software storage objects (SSO's) /tmp Director temporar /usr Conine rutine utilizator /var Fiiere obiect nepartajate /home Directorul utilizatorilor sistemului Unele dintre directoarele UNIX sunt mai interesante dect altele; existena i coninutul acestor directoare depinde de varianta de UNIX utilizat. Nu exist practic reguli foarte stricte cu privire la localizarea fiierelor. Spre exemplu, pentru a gsi anumite fiiere sistem binare, putem cuta ntr-unul din directoarele: /bin, /usr/bin, /sbin, /usr/sbin i chiar n /etc. Fiierele binare motenite se pot gsi n /usr/ucb sau /usr/bsd. Alte fiiere executabile se pot gsi n alte locuri din structura de directoare. i legturile simbolice trebuie considerate cu atenie; directorul /home poate fi definit ca avnd propriul sistem de fiiere (montat separat) sau poate fi definit ca subdirector al rdcinii. Pe serverele Solaris, spre exemplu, el este gsit ca subdirector al directorului /export; de regul, acest director conine directoarele home ale utilizatorilor existeni n sistem. Spaiul dedicat stocrilor temporare este localizat, de regul, n directorul /tmp. Acest director poate fi accesat pe majoritatea sistemelor ca /tmp, /usr/tmp sau /var/tmp. Dou dintre cele trei referine vor fi directoare reale iar cea de-a treia va fi o legtur simbolic (symlink) ctre una din primele dou. Varianta de UNIX utilizat va influena care dintre aceste referine este legtura simbolic. Se recomand totui ca aceste directoare s /bin /dev /etc /lib /mnt

28

UNIX

fie reconfigurate astfel nct o singur referin s fie un director real, iar celelalte dou s fie legturi simbolice ctre acest director. Mai mult, acest director se recomand a fi montat separat. Deoarece utilizatorii pot scrie fiiere de dimensiuni mari n spaiul temporar /tmp, montarea separat asigur protecia directoarelor / i /usr fa de umplerea cu fiiere temporare. O regul general valabil n acest sens este aceea c utilizatorii nu trebuie s aib drept de creare i tergere de fiiere n locaiile / i /usr. Directorul /tmp trebuie s aib permisiuni de acces 1777, nu 777. Dreptul de acces 777 permite ca orice utilizator s aib drepturi depline n directorul /tmp, n timp ce 1777 seteaz aa-numitul sticky bit ce nseamn c directorul poate fi modificat sau ters doar de ctre proprietar. Directorul /usr poate fi montat separat sau poate fi subdirector al lui /. Subdirectoarele sale pot fi: bin fiiere binare include fiiere pentru programare lib biblioteci de programe local pachete software locale, biblioteci, fiiere include, fiiere binare (de regul /usr/local se monteaz separat pentru a nu umple directorul /usr). sbin fiiere de sistem binare share informaie partajat, inclusiv pagini de manual. Directorul /var poate fi montat separat (ceea ce este recomandat) sau poate fi subdirector al lui / sau /usr. Subdirectoarele sale pot fi: adm stocare fiiere log (Solaris) crash diagnostic n situaii de oprire brusc log stocare fiiere log (Solaris i Linux Red Hat) mail zona de stocare pentru pota electronic spool zona de spool pentru printare, utilitarul cron i alte servicii yp zona de stocare pentru fiierul de configurare NIS. 2.2 Partiii

Partiiile reprezint modalitatea de organizare a spaiului de pe disc la nivel jos. Partiiile sunt independente de sistemul de operare; un sistem de operare solid recunoate diviziunile la nivel jos de pe disc i adreseaz fiecare partiie ca pe un echipament logic separat.

29

Sistemul de fiiere UNIX i comenzi

Toate informaiile cu privire la partiii sunt localizate n aa-numita tabel de partiii (partition table), stocat n eticheta de disc sau n header-ul de volum (volume header) al discului fizic. Aceasta este modalitatea prin care discurile pstreaz propriile informaii referitoare la modalitatea de aranjare a datelor i de aceea ele pot fi transferate de la un calculator la altul fr riscul pierderii informaiei. De asemenea, partiiile permit existena mai multor sisteme de operare pe acelai calculator, instalate n partiii diferite. Iniial, exista o coresponden strict ntre partiii i sistemele de fiiere, partiiile fiind considerate drept containere pentru sistemele de fiiere. Acum un sistem de fiiere se poate ntinde pe mai multe partiii prin utilizarea volumelor logice, astfel nct partiiile pot fi considerate elemente de baz pentru stocarea informaiei n loc de a fi interpretate drept simple containere. Deoarece partiiile sunt diviziuni la nivel hardware ale discurilor, ele pot oferi o protecie la nivel jos mpotriva supra-ncrcrii. Utilizndu-se anumite politici de partiionare, unele dintre partiii pot fi supra-ncrcate fr a afecta performanele generale ale sistemului; n orice caz, umplerea unei partiii nu are cum s afecteze spaiul altei partiii. 2.3 Spaiul de swap Toate varietile de UNIX necesit minimum dou partiii: partiia de root (/) i partiia pentru swap. n cazul (destul de puin ntlnit n practic) n care exist doar aceste dou partiii, partiia / va conine ntregul sistem de operare, aplicaiile, fiierele de configurare, conturile locale ale utilizatorilor, etc. Spaiul de swap sau, pe scurt, swap, permite accesul direct al sistemului de operare la spaiul brut de pe disc, fr implicarea sistemului de fiiere. Swap-ul a fost construit pentru a aciona ca o extensie a memoriei principale (RAM Random Access Memory) a calculatorului, permind, prin implementarea mecanismului memoriei virtuale, accesul la o cantitate de memorie ce nu este limitat de capacitatea memoriei RAM ci de spaiul liber de pe disc. Principalele mecanisme utilizate de ctre sistemul de operare pentru a accesa spaiul de swap sunt paginarea (paging) i interschimbarea (swapping). Spaiul liniar al memoriei unui calculator este limitat iar o parte din acesta este rezervat pentru stocarea unor programe ce rmn rezidente n memorie (sistemul de operare, tabelele de paginare, etc.) pentru a fi accesate rapid cnd este nevoie de ele. De asemenea, multe procese i obiecte program nu necesit prezena permanent n memorie ca n cazul programelor rezidente. Atunci cnd sistemul de operare gsete un astfel de proces, se caut modaliti de nlocuire a lui cu altul ce trebuie executat i deci ncrcat n memorie.

30

UNIX

Procedeul de interschimbare sau swapping este unul dintre mecanismele utilizate de ctre sistemul de operare pentru a administra alocarea memoriei. Atunci cnd un proces este interschimbat, el este copiat din memorie n spaiul de swap mpreun cu toate datele asociate i alte informaii de stare. n acest fel, poriunea din memorie alocat procesului devine liber i poate fi utilizat pentru a stoca alt proces (program). n momentul n care este nevoie din nou de procesul aflat n swap, acesta este transferat rapid din swap n memoria principal pentru a fi executat. n esen, procedeul de swapping const n transferul unui proces din memorie n spaiul de swap i viceversa. Atunci cnd procedeul de swapping este intens utilizat nseamn c sistemul are nevoie de resurse hardware suplimentare (de regul mai mult memorie RAM). Paginarea utilizeaz, de asemenea, spaiul de swap. Spre deosebire de procedeul de interschimbare, care stocheaz mpreun cu procesul i o serie ntreag de informaii legate de starea procesului, paginarea stocheaz doar poriuni ale codului executabil al unui proces. Paginarea reprezint o metod obinuit de administrare a memoriei de ctre sistemul de operare, metod n care acesta determin n prealabil dimensiunea segmentelor de memorie (denumite pagini) ce pot fi meninute n memoria principal. Referitor la spaiul de swap, unele variante de UNIX depind mult de acest spaiu. Solaris-ul firmei Sun folosete spaiul de swap pentru directorul /tmp n mod implicit. 2.4 Tipuri de fiiere Fiiere text Fiiere de date Fiiere surs (ce conin codul surs al unor programe) Fiiere executabile Programe shell Fiiere legtur Fiiere asociate unor dispozitive a) Fiiere text Cel mai simplu tip de fiiere l constituie fiierul text, ce conine doar caractere ca acelea pe care le putei citi n cadrul acestui capitol. Aceste caractere ASCII (American Standard Code for Information Interchange) sunt literale sau caractere numerice ce reprezint manifestarea muncii pe Principalele tipuri de fiiere existente pe un sistem UNIX sunt:

31

Sistemul de fiiere UNIX i comenzi

care o facem. Dac utilizm, spre exemplu, un editor UNIX pentru a crea un mesaj pentru pota electronic atunci crem un fiier text n cele mai multe dintre cazuri. Avem n continuare un exemplu de fiier ASCII de pe un sistem Linux:
:.Z: : :/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS : : :.Z:/bin/compress -c %s:T_REG:O_COMPRESS:COMPRESS :.gz: : :/bin/gzip -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:GUNZIP : : :.gz:/bin/gzip -9 -c %s:T_REG:O_COMPRESS:GZIP : : :.tar:/bin/tar -c -f - %s:T_REG|T_DIR:O_TAR:TAR : : :.tar.Z:/bin/tar -c -Z -f %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS : : :.tar.gz:/bin/tar -c -z -f %s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP

b) Fiiere de date Fiierele de date sunt fiierele ce conin date utilizate de diverse aplicaii de pe sistem. Dac utilizm un program de tipul FrameMaker pentru scrierea unei cri, fiierele create cu acest program vor fi de tipul suportat de acesta (la fel ca i fiierele speciale de date de pe un sistem Windows). Fiierele de date conin pe lng informaia n sine (de tip text) i informaii speciale de formatare. Acelai lucru se petrece i n cazul unui fiier baz de date, ce conine att date ce pot fi citite ct i informaii specifice formatrii respective. c) Fiiere cod surs Fiierele cod surs sunt fiiere ce conin date scrise ntr-un limbaj de programare precum C, C++, Java, Pascal, Fortran etc. Aceste fiiere au, de regul, extensii conforme cu limbajul n care au fost scrise; spre exemplu, un program surs scris n C va avea extensia .c. d) Fiiere executabile Fiierele executabile reprezint programe obinute cu ajutorul unui compilator (sau interpretor) i editor de legturi ce pot fi rulate (executate). Dac ncercm s citim un fiier executabil ca pe un fiier text, vom obine o serie de caractere ciudate i chiar sunete; n urma unei astfel de citiri se pot pierde setrile ecranului. Majoritatea comenzilor UNIX sunt programe executabile (vezi directorul /bin).

32

UNIX

e) Programe de tip shell Un fiier de tip shell este att un fiier text ct i un fiier ce poate fi rulat. El conine linii text ce reprezint instruciuni legate de programarea shell; de regul, prima linie din program este o linie ce ncepe cu secvena de caractere #! i precizeaz tipul de shell utilizat. De exemplu, linia:
#!/bin/sh

specific faptul c se utilizeaz shell-ul Bourne care este shell-ul clasic pentru un sistem UNIX. n general, caracterul # reprezint modalitatea de inserare a comentariilor n program; astfel, tot ce urmeaz dup # i pn la sfritul liniei este considerat comentariu. f) Fiiere de tip legtur Un fiier legtur (link) este o referin ctre un fiier stocat n alt locaie n sistem. n loc s avem dou sau mai multe copii ale unui fiier pe disc, putem crea o legtur ctre un fiier deja existent pe sistem. Un mod deosebit de utilizare a legturilor pe un sistem UNIX a fost acela legat de apariia unei noi versiuni a sistemului de operare. Cum locaiile fiierelor se modific uneori la apariia unei noi versiuni a sistemului de operare, se folosesc legturi de la locaiile vechi ctre cele noi n loc de a nva noile locaii. n momentul utilizrii unei comenzi folosind vechea locaie, legtura face referire la comanda ce acum se afl n alt loc pe disc. g) Fiiere asociate unor dispozitive Fiierele asociate unor dispozitive, denumite n UNIX device special files(sau, pe scurt, fiiere device) conin informaii legate de componente hardware ale calculatorului i sunt fiiere speciale cu referire (de regul) la funcii de administrare a sistemului. Sistemul de operare UNIX trateaz dispozitivele hardware ca fiiere, avantajul acestei metode de administrare fiind acela c permite accesul la disc precum o simpl operaie de acces (Input/Output) la un fiier. Dispozitivele instalate pe computer pot fi accesate prin intermediul unor astfel de fiiere speciale. Discul, spre exemplu, poate fi accesat fie printr-un fiier de tip bloc, fie printr-unul de tip caracter.

33

Sistemul de fiiere UNIX i comenzi

Semnificaia subdirectoarelor din /dev la Solaris


Tabelul 2.1 Directorul /dev/cua /dev/dsk /dev/fd /dev/kmem /dev/log /dev/mem /dev/null /dev/pts /dev/rdsk /dev/rmt /dev/swap /dev/tty /dev/zero Descriere Director pentru dispozitive seriale Director pentru dispozitive de tip bloc (hard-discuri, CD-ROM-uri, etc.) Director pentru uniti floppy Director pentru memoria virtual kernel Director socket ctre login-ul sistem Dispozitiv pentru memoria fizic Dispozitivul null Pseudo-terminale Director pentru echipamente device de tip caracter Director pentru medii de stocare movibile band magnetic Spaiul de swap Director pentru linii terminal Surs null byte

Fiierele device de tip caracter sunt cel mai des folosite pentru proceduri de copiere de octei (ca n cazul comenzii dd). Majoritatea echipamentelor de band au asociate doar fiiere device de tip caracter. Fiierele device de tip bloc sunt utilizate pentru transferul de date n blocuri de octei, ceea ce este mai avantajos i mai rapid pentru majoritatea aplicaiilor. Pentru varianta de UNIX Solaris, hard-discurile au asociate att un fiier device de tip caracter ct i unul de tip bloc. Fiecare dintre acestea sunt folosite n cazuri diferite. Operaiile uzuale se fac prin intermediul fiierelor bloc, ns crearea sistemului de fiiere se face cu ajutorul fiierelor caracter. Toate fiierele device standard UNIX sunt pstrate n directorul /dev (unele implementri de Linux Red Hat pstreaz acest sistem). n varianta UNIX Solaris i n unele noi implementri de Red Hat ns, coninutul lui /dev tinde s fie o combinaie de fiiere device i de legturi simbolice ctre fiiere device situate n alte directoare. ntr-un astfel de sistem, directorul

34

UNIX

/dev acioneaz ca un redirector organizaional. n Red Hat directorul se numete /devfs iar sub Solaris se intituleaz /devices. Fiierele i directoarele din directorul /dev variaz foarte mult, chiar ntre versiuni ale aceleiai variante de sistem de operare. n tabelul 2.1 sunt prezentate o serie dintre subdirectoarele reprezentative pentru /dev ntlnite la Solaris. n continuare vom prezenta cteva comenzi de baz referitoare la manipularea fiierelor i directoarelor pe un sistem UNIX. 2.5 Comenzi referitoare la fiiere i directoare Pentru a putea naviga n cadrul sistemului de fiiere trebuie s cunoatem n principiu dou comenzi: prima comand (pwd) afieaz localizarea curent (directorul n care ne aflm la un moment dat) iar cea dea doua comand (cd) este utilizat pentru a schimba directorul curent. S vedem mai nti care este sintaxa general a unei comenzi UNIX. n momentul n care suntem conectai la sistem sau atunci cnd folosim o fereastr terminal, pe acran apare un prompter. n cazul shell-urilor Bourne i Korn, prompterul este semnul dolar ($) pentru un utilizator obinuit i semnul diez (#) pentru utilizatorul root. n cazul shell-ului C, semnul special pentru prompter pentru un utilizator obinuit este semnul procent (%). Odat cu apariia prompterului, putem introduce comenzi la linia de comand. Formatul general al unei comenzi UNIX este:
$ comanda [optiune(optiuni)] [argument(e)]

n formatul general de mai sus, identificm urmtoarele componente: semnul dolar $ reprezint prompterul shell, comanda reprezint programul executabil, optiune/optiuni identific posibilitatea modificrii programului executabil pentru a rula n condiii specifice iar argument/argumente reprezint fiier (fiiere) sau director (directoare), inclusiv cu calea ctre fiierul sau directorul specificat, sau un text. Separarea acestor componente se face prin semnul spaiu; pe o singur linie putem introduce pn la 256 de caractere (nu se recomand, desigur, folosirea unui numr att de mare de caractere pe o singur linie). Toate comenzile UNIX sunt scrise cu litere mici. Opiunile sunt formate din litere precedate de semnul liniu sau minus (-). Se pot combina mai multe opiuni folosind un singur semn minus. Opiunile pot fi att litere mici ct i litere mari, n funcie de comand. Nu toate comenzile necesit toate cele 3 componente. Se pot scrie mai multe comenzi pe aceeai linie, separate de caracterul punct i virgul (;). Principala comand de navigare n cadrul sistemului de fiiere UNIX este cd (change directory). O alt comand folosit pentru a afla directorul curent este pwd (print working directory).

35

Sistemul de fiiere UNIX i comenzi

Comanda pwd este des utilizat pentru a ne reaminti directorul n care ne alfm la un moment dat (directorul curent). Comanda pwd este folosit fr opiuni si fr argumente; trebuie doar s tastm pwd la linia de comand i s apsm tasta ENTER. Presupunnd c ne aflm n directorul /home/serban/test, vom obine urmtorul rspuns al comenzii pwd:
$ pwd /home/serban/test

Modificarea directorului curent i navigarea n cadrul structurii sistemului de fiiere i directoare se face utiliznd comanda cd (change directory). Aceast comand accept ca argument att ci relative ct i ci absolute. Sintaxa general a acestei comenzi este:
$ cd [nume_director]

Exemple:
$ cd /tmp

Schimb directorul curent n directorul /tmp, acest director devenind directorul curent, iar:
$ cd /usr/stud

Schimb directorul curent n directorul /usr/stud. Observaie: Exist dou modaliti de referire a unei ci n structura de fiiere UNIX: calea absolut i calea relativ. O cale absolut este aceea care pleac din rdcin, deci ncepe cu "/". Un exemplu de cale absolut este: /usr/bin. O cale relativ nu ncepe cu "/", ci reprezint o localizare relativ la directorul curent de lucru. Cile ce ncep cu ../, ./ sau altceva diferit de / sunt ci relative. Cile relative au avantajul c sunt mai scurte dect cile absolute; pentru a le utiliza ns, trebuie s cunoatem directorul n care ne aflm deoarece acesta este punctul de plecare al cii relative. Un exemplu de cale relativ ntlnim n exemplul urmtor:
$ cd ../../bin

36

UNIX

Uneori este mai uor s utilizm meta-caractere. n UNIX, caracterul star (*) este un caracter special (meta-caracter) i semnific orice combinaie de caractere. Spre exemplu, comanda "cd /u*/s*" ne poziioneaz n directorul /usr/stud dac acest director este singurul ce corespunde ablonului specificat. Mai multe noiuni despre meta-caractere vor fi prezentate n cadrul capitolului curent. Alte exemple:
$ cd

Comanda cd apelat fr nici un argument ne poziioneaz n directorul home.


$ cd ..

Aceast comand ne poziioneaz n directorul printe al directorului curent (cu un nivel mai sus n structura arborescent de directoare).
$ cd ~

Aceast comand ne poziioneaz n directorul home.


$ cd ~-

Dac se folosete shell-ul Korn, aceast comand ne poziioneaz n directorul anterior de lucru.
$ cd ~nume_utilizator

Aceast comand ne poziioneaz n directorul home al utilizatorului identificat prin nume_utilizator. Listarea coninutului unui director Comanda ls (list) este folosit pentru listarea fiierelor i directoarelor, cu informaii despre acestea. Comanda ls apelat simplu, fr opiuni, listeaz fiierele din directorul curent. Fiierele ale cror nume ncep cu "." sunt considerate fiiere ascunse i nu vor fi afiate n acest caz. Fiierele ascunse sunt, de regul, folosite pentru a personaliza mediul de lucru al unui utilizator. Aceste fiiere nu sunt implicit afiate deoarece nu sunt editate frecvent. Directorul curent (.) i directorul printe (..) sunt i ele ascunse i nu sunt afiate deoarece ncep cu semnul punct (.).

37

Sistemul de fiiere UNIX i comenzi

Comanda ls are o serie ntreag de opiuni, fiind una dintre cele mai folositoare i flexibile comenzi UNIX. Exemple:
$ ls -a

Aceast comand este folosit pentru a afia toate fiierele, inclusiv cele ascunse.
$ ls -l

Aceast comand ne ofer un "listing lung", adic informaii suplimentare legate de fiiere (nu numai numele acestora). Aceste informaii cuprind date referitoare la drepturile de acces la fiiere, proprietarul i grupul crora aparin, dimensiune, data i ora ultimei modificri.
drwxr-xr-x 2 root -r--r--r-1 root drwxr-xr-x 2 root -rwxr-xr-x 2 root -rwxr-xr-x 2 root -rwxr-xr-x 1 bin -rwxr-x--x 1 root -rwxr-x--x 1 root -rwxr-xr-x 2 root -rwxr-xr-x 2 root -rwxr-xr-x 1 root -rwxr-xr-x 1 root drwxr-xr-x 2 root -rwxr-x--x 1 root sys sys sys sys sys bin sys sys sys sys sys sys sys sys 60676 Aug 22 1994 Lib 60676 Aug 22 1994 README 60676 Aug 22 1994 Source 60676 Aug 22 1994 gzexe 60676 Aug 22 1994 gzip 242436 Feb 20 16:07 httpd 599604 Sep 22 1995 kermit 171195 Jan 22 12:15 memhog 5599 Jan 22 12:15 nlsym 553836 Feb 20 16:40 perl 553836 Feb 20 16:40 perl5.003 13855 Feb 20 16:40 perlbug 8984 Feb 20 16:40 perldoc 60676 Aug 22 1994 src 108781 Jan 22 12:15 u486mon

-rwsr-xr-x 1 uucp uucp

Figura 2.2 Exemplu de listare generat de comanda ls -l

38

UNIX

Funcionalitile celor dou opiuni de mai sus pot fi combinate folosind comanda ls -al. n figura 2.2 avem un exemplu de listare a fiierelor dintr-un director. Alte exemple:
$ ls -al /tmp

Se poate specifica n mod explicit directorul pentru care s se fac listarea. Astfel, comanda anterioar va lista fiierele coninute n directorul tmp.
$ ls -alR /usr | more

Comanda anterioar va lista informaiile despre fiierele din directorul /usr, precum i din toate subdirectoarele acestuia. Opiunea care determin acest lucru este -R. Un exemplu de listing pentru comanda ls -alR este prezentat n figura 2.3. Comanda more precizeaz c afiarea se va face pagin cu pagin.

Figura 2.3 Exemplu de listing al comenzii ls -alR


$ ls -ld /usr

39

Sistemul de fiiere UNIX i comenzi

Comanda anterioar listeaz informaii despre nsi directorul /usr i nu despre coninutul acestuia. Aceste informaiii sunt utile atunci cnd vrem s verificm drepturile de acces la un director. n fiecare linie din listingul comenzii ls al (ca cel din figura 2.2), primul caracter reprezint tipul fiierului (d pentru director, - pentru fiier simplu, l pentru fiier legtur, etc.). Urmtoarele 9 caractere reprezint drepturile de acces la fiier pentru utilizatorul care este proprietarul fiierului, pentru grupul din care face parte proprietarul i pentru ceilali utilizatori (n aceast ordine).
$ ls -F

Figura 2.4 Listing al comenzii ls -F

Aceast comand afieaz informaii legate de tipul fiierelor. Dac fiierul afiat este director, numele acestuia este urmat de semnul slash (/). Dac fiierul este un fiier simplu ASCII, fr format special, nu apare nici un simbol special dup numele acestuia. n cazul unei aplicaii, comenzi sau fiier script ce poate fi executat, numele fiierului este urmat de caracterul asterisk (*). Dac numele fiierului este urmat de simbolul at (@) nseamn c acest fiier este o legtur simbolic. n figura 2.4 avem un exemplu de listing pentru comanda ls -F.

40

UNIX

Drepturile de acces la fiiere i directoare


d d r w x r w x r w x r w x r - x r w x r w r - - - - - r w x r - r - - - - - -

Cele 10 coloane care reprezint drepturile de acces la fiiere sunt: S analizm n continuare semnificaia acestor coloane:
Coloana 1 d d r r r r Coloana 2-4 w x w x w x x r r r Coloana 5-7 w x w Coloana 8-10 r w x r r -

Coloana 1: Ne arat faptul c un fiier este director(d), fiier obinuit (-), sau un tip special de fiier. Coloanele 2-4: Ne arat care sunt drepturile de acces la fiier pentru utilizatorul care este proprietarul fiierului. Drepturile de acces pot fi: de citire (r), scriere (w), i execuie (x). Coloanele 5-7: Ne arat care sunt drepturile de acces la fiier pentru grupul proprietar al fiierului. Drepturile de acces pot fi aceleai: citire (r), scriere (w) i execuie (x). Coloanele 8-10: Ne arat care sunt drepturile de acces la fiier pentru utilizatorii care nu sunt n grupul proprietar al fiierului (others). Drepturile de acces pot fi aceleai: citire (r), scriere (w) i execuie (x). Drepturile de acces la fiiere i directoare se pot modifica folosind comanda chmod (change mode). Mai multe despre aceast comand n capitolul 5.

41

Sistemul de fiiere UNIX i comenzi

Tipuri de fiiere UNIX


Tabelul 2.5
Tipul de fiier d b c l M P S b) Descriere Fiier simplu ("ordinary file") Director Fiier bloc ("block special") Fiier caracter ("character special") Fiier legtur ("link") Fiier de memorie partajat ("shared memory") Fiier pipe ("named pipe") Fiier semafor ("semaphore")

Tipurile de fiiere UNIX sunt prezentate n tabelul 2.5. Caracteristici: Fiierele simple (-) Nu este impus nici o structur asupra coninutului - acesta reprezint o niruire de octei; Aceste fiiere pot fi text (ASCII) sau binare. Fiiere director (d) Reprezint un fel de tabel de fiiere; Are o structur intern precis definit; Ofer posibilitatea organizrii sistemului de fiiere. Fiierele bloc (b) Identific un dispozitiv; Este un bloc de I/O; Pot identifica uniti floppy, hard-discuri, uniti de band. Fiiere caracter (c ) Identific un dispozitiv; Reprezint caractere de I/O; Pot identifica porturi seriale, paralele (terminale, imprimante).

42

UNIX

Fiiere de legtur simbolic (l) Sunt fiiere pointer ctre alt fiier existent; Sunt de regul folosite pentru a oferi un alias altui fiier. Fiiere de memorie partajat (m) Permit mai multor programe s acceseze un spaiu comun de memorie; Folosite de regul de programele de aplicaii. Fiiere pipe (p) Folosite pentru a transmite date ntre comenzi sau programe. Fiiere semafor (s) Folosite pentru sincronizarea proceselor active concurente; Folosite de programele de aplicaii.
Nr de legturi Proprietarul Dimensiunea n octei Grupul Data Numele fiierului

drwxr-xr-x -r--r--r-drwxr-xr-x -rwxr-xr-x -rwxr-xr-x -rwxr-xr-x -rwsr-xr-x -rwxr-x--x -rwxr-x--x -rwxr-xr-x -rwxr-xr-x -rwxr-xr-x -rwxr-xr-x drwxr-xr-x -rwxr-x--x

2 1 2 2 2 1 1 1 1 2 2 1 1 2 1

root root root root root bin uucp root root root root root root root root

sys sys sys sys sys bin uucp sys sys sys sys sys sys sys sys

60676 Aug 22 1994 Lib 60676 Aug 22 1994 README 60676 Aug 22 1994 Source 60676 Aug 22 1994 gzexe 60676 Aug 22 1994 gzip 242436 Feb 20 16:07 httpd 599604 Sep 22 1995 kermit 171195 Jan 22 12:15 memhog 5599 Jan 22 12:15 nlsym 553836 Feb 20 16:40 perl 553836 Feb 20 16:40 perl5.003 13855 Feb 20 16:40 perlbug 8984 Feb 20 16:40 perldoc 60676 Aug 22 1994 src 108781 Jan 22 12:15 u386mon

43

Sistemul de fiiere UNIX i comenzi

Considernd listingul anterior, putem observa i alte informaii legate de fiierele i directoarele afiate: Numrul de legturi (link-uri) reprezint numrul de legturi simbolice ctre acest fiier; Proprietarul reprezint numele utilizatorului care deine acest fiier; Grupul reprezint numele grupului de utilizatori din care face parte proprietarul; Dimensiunea - este exprimat n octei; Data data i ora ultimilor modificri fcute asupra fiierului sau data de creare a fiierului; Numele fiierului. Observaie Pe un sistem Linux, comanda ls deriv din proiectul GNU fileutils, avnd o ntreag serie de opiuni i caracteristici speciale. Spre exemplu, numele de fiiere pot aprea listate n culori n funcie de tipul de fiier. Culorile folosite la afiare sunt definite n fiierul /etc/DIR_COLORS; acestea se pot personaliza folosind i fiierul .dir_colors din directorul curent home. Formatul acestui fiier este definit n fiierul /etc/DIR_COLORS. Pentru a afia numele fiierelor fr culori dar cu simboluri, se pot folosi opiunile --color i --classify. n mod asemntor cu opiunea -F, simbolurile --classify sunt urmtoarele: / pentru directoare, * pentru programe, @ pentru legturi simbolice, | pentru fiiere de tip pipe i = pentru fiiere de tip socket. Astfel, listingul comenzii:
$ ls --color=never --classify studenti/ lista.sh* text.sub

semnific faptul c studenti este director, iar fiierul lista.sh este executabil.

44

UNIX

2.6

Caractere speciale n UNIX

Caracterele speciale sau metacaracterele sunt caractere cu semnificaie special pentru shell-ul UNIX. n general, caracterele de pe tastatur care nu sunt alfanumerice sunt metacaractere. Metacaracterele sunt utilizate mpreun cu majoritatea comenzilor UNIX pentru a oferi o mai mare flexibilitate. Cteva dintre metacaracterele folosite n UNIX sunt similare cu cele utilzate n MS-DOS. Caracterul asterisk (*) i semnul de ntrebare (?) sunt metacaractere cunoscute i sub numele de wildcard-uri, fiind folosite pentru a lucra cu grupuri de fiiere ntr-un mod mai eficient. n tabelul 2.6 sunt prezentate cteva dintre cele mai folosite metacaractere mpreun cu o scurt descriere a funcionalitii acestora. Fiind vorba despre nite caractere speciale, trebuie s nu folosim metacaractere atunci cnd denumim un fiier sau un director. Caracterul punct ( . ) i caracterul underscore ( _ ) sunt unicele caractere non alfanumerice care nu sunt metacaractere. Din aceast cauz aceste dou caractere pot fi folosite n cadrul numelor de fiiere. Semnul minus ( - ), cu toate c este metacaracter, poate fi, de asemenea, utilizat n cadrul numelor de fiiere. Cele mai uzuale metacaractere
Tabelul 2.6
Metacaracterul * ? ; [] > Descriere Reprezint orice caracter sau secven de caractere Identific un singur caracter Permite scrierea mai multor comenzi pe aceeai linie Identific o mulime sau un domeniu de caractere pentru o singur poziie Redirecteaz ieirea unei comenzi ctre un fiier n loc de ecran (stdout fiierul standard de ieire). Redirecteaz intrarea unei comenzi dintr-un fiier n loc de tastatur (stdin - fiierul standard de intrare) Redirecteaz eroarea unei comenzi ctre un fiier n locul ecranului Adaug ieirea unei comenzi la un fiier existent (concatenare) * ? comanda;comanda [domeniu] comanda > fisier Formatul comenzii

<

comanda < fisier

2> >>

comanda 2> fisier comanda >> fisier

45

Sistemul de fiiere UNIX i comenzi Metacaracterul | (semnul pipe) $ % ~ ! Descriere Preia ieierea unei comenzi i o paseaz ca intrare comenzii urmtoare Indicatorul prompter-ului standard pentru shell-ul Bourne i Korn Indicatorul prompter-ului standard pentru shell-ul C Indic directorul home Re-execuia comenzii Formatul comenzii comanda | comanda Nu se aplic Nu se aplic ~ !n, unde n este numrul comenzii introduse

Cele mai utilizate metacaractere sunt asteriskul (*), semnul ntrebrii ( ? ) i parantezele ptrate ( [ ] ). Caracterul asterisk sau star (*) este un caracter de substituie pentru un caracter sau mai multe (sau nici unul !), cu excepia caracterului punct de nceput al unui fiier ascuns. Caracterul star poate fi deosebit de util n unele situaii, precum n cazul comenzilor ls (list), cp (copy), mv (move) sau rm (remove). Dac dorim s afim dintr-un director doar fiierele al cror nume ncepe cu litera s putem folosi comanda ls s*. Un exemplu de listing este n figura 2.7.

Figura 2.7 Listingul comenzii ls s*

46

1. Administrarea fiierelor i directoarelor

3
3.1

ADMINISTRAREA FIIERELOR I DIRECTOARELOR

Introducere

n acest capitol vom prezenta att comenzile de baz ct i comenzi mai avansate utilizate n administrarea fiierelor i directoarelor pe un sistem UNIX. Ne vom concentra asupra utilizrii comenzilor la linia de comand. Cu toate c administrarea fiierelor i directoarelor se poate face i prin utilizarea unei interfee grafice precum GNOME, spre exemplu, exist dou motive suficient de puternice pentru a ne convinge c un bun utilizator UNIX trebuie s tie s foloseasc linia de comand: n primul rnd, linia de comand ofer posibilitatea utilizrii a numeroase opiuni, deci ofer o mai mare flexibilitate; n al doilea rnd, prin intermediul liniei de comand se poate face administrarea pe un sistem aflat la distan, pe care nu putem folosi o interfa grafic (cazul cel mai des ntlnit). 3.2 Funcionaliti ale liniei de comand i comenzi de baz

Cunoaterea utilizrii comenzilor la linia de comand reprezint piatra de baz ce st la temelia cunoaterii sistemului de operare UNIX. Multe dintre instrumentele de management ale sistemului de operare i dintre aplicaiile de configurare a dispozitivelor hardware presupun folosirea liniei de comand. De asemenea, de multe ori este necesar crearea aa numitelor shell-scripturi, programe utilizate de regul pentru automatizarea unor activiti specifice sistemului de operare. Fiierele shell-script sunt compuse din comenzi UNIX i sunt asemntoare cu fiierele de comenzi (batch) utilizate i n alte sisteme de operare pentru reea.

47

UNIX

3.2.1 Folosirea combinaiilor de control Combinaiile de control sunt utilizate pentru a realiza anumite sarcini specifice, cum ar fi terminarea sau pornirea afirii pe ecran, ieirea din sesiunea de lucru curent, terminarea imprimrii etc. Majoritatea tastaturilor de PC actuale au dou taste de control, inscripionate cu Ctrl i care se gsesc n colurile stnga-jos i dreapta-jos. Atunci cnd apare pe ecran, semnul corespunztor tastei Ctrl este semnul caret (^). Pentru introducerea unei secvene de control, se ine apsat tasta Ctrl i simultan se apas i o alt tast de pe tastatur. Cea mai uzitat secven de control este probabil secvena Ctrl+c, utilizat pentru ntreruperea unui program sau proces ce se afl n execuie. Aceast combinaie apare pentru shell drept ^C i se obine n urma apsrii simultane a tastelor Ctrl i a tastei C. Alte combinaii de control care mai pot fi folosite sunt urmtoarele: Ctrl+s - determin oprirea defilrii informaiei pe ecran. Aceast combinaie poate fi utilizat, spre exemplu, atunci cnd vizualizm cu ajutorul comenzii cat un fiier mai mare pe ecran i dorim oprirea defilrii informaiei pe ecran. Ctrl+q - reia defilarea informaiei pe ecran atunci cnd aceasta a fost ntrerupt cu Ctrl+s. Ctrl+c - ntrerupe activitatea curent i este des folosit pentru oprirea forat a programelor sau proceselor aflate n execuie sau n cazul unor listinguri interminabile pe ecran obinute n urma comenzilor man, cat sau ls. De exemplu, n cazul n care am folosit comanda man i vrem s oprim defilarea n continuare a ecranelor cu paginile de manual (am vzut ceea ce ne interesa i vrem s terminm afiarea), putem folosi Ctrl+c pentru a ne ntoarce la prompter (n acest caz, un rezultat identic se obine prin apsarea tastei q - quit). Ctrl+d - se folosete pentru a marca sfritul de fiier sau ieirea (exit). Aceast combinaie este folosit fie pentru a iei din unele utilitare UNIX (bc, write, etc.), pentru ieirea dintr-o fereastr terminal sau pentru ieirea din sesiunea curent de lucru (logout). Ca o regul general, putem ncerca combinaia Ctrl+d ori de cte ori Ctrl+c nu funcioneaz. Ctrl+u - se folosete pentru tergerea ntregii linii de comand. Se poate folosi n cazul n care dorim s tergem rapid ntreaga linie deoarece ne-am hotrt s nu mai rulm comanda introdus. Ctrl+w - se folosete pentru tergerea ultimului cuvnt de la linia de comand.

48

Administrarea fiierelor i directoarelor

Ctrl+h - se folosete pentru tergerea ultimului caracter introdus la linia de comand. Se folosete atunci cnd suntem conectai la un sistem la distan i tasta Backspace nu funcioneaz deoarece pe sistemul de la distan aceast tast nu este setat s acioneze precum combinaia Ctrl+h. 3.2.2 Determinarea tipului unui fiier n cazul lucrului cu diverse fiiere este deosebit de util s cunoatem tipul fiierului cu care lucrm. n acest sens, putem folosi: Comanda file Comanda file este folosit pentru a determina tipul unui anumit fiier. Ea difer puin pentru fiecare implementare UNIX. Pentru un sistem UNIX, listingul n cazul unui fiier text va fi:
$ file temp.txt temp.txt: ascii text

n exemplul urmtor avem cazul unui sistem Linux:


$ file serban serban: ASCII text

Alt exemplu consider afiarea tipurilor de fiiere al cror nume ncepe cu litera c din directorul /bin:
/bin $ file c* cat: ELF 32-bit LSB executable 80386 cd: sh commands text chgrp: ELF 32-bit LSB executable 80386 chmod: ELF 32-bit LSB executable 80386 chown: ELF 32-bit LSB executable 80386 chroot:ELF 32-bit LSB executable 80386 cksum: ELF 32-bit LSB executable 80386 clear: Bourne/Korn shell commands text

3.2.3 Vizualizarea fiierelor text Pentru a vizualiza fiiere de tip text (ASCII) vom prezenta n cele ce urmeaz comenzile cat, more, head i tail.

49

UNIX

Comanda cat Comanda cat (denumirea provine de la concatenate) ne ofer posibilitatea vizualizrii fiierelor text. Deoarece comanda cat afieaz rapid pe ecran coninutul fiierului respectiv, trebuie s fim pregtii s folosim combinaiile Ctrl+s i Ctrl+q prezentate anterior sau s folosim comanda more. Exemplu: $ cat /home/razvan/.profile va afia coninutul fiierului /home/razvan/.profile pe ecran. n cazul n care coninutul fiierului este mai mare dect un ecran, aceast comand poate fi conectat prin pipe cu comanda more astfel: $ cat /etc/passwd | more i astfel se va afia ecran cu ecran coninutul fiierului /etc/passwd. Comanda cat poate fi utilizat i pentru concatenarea a dou sau mai multe fiiere ntr-unul singur. n acest caz, sintaxa este urmtoarea:
$ cat fisier_1 [fisier_2 [fisier_n]] > fisier_complet

Fiierele fisier_1, fisier_2, ..., fisier_n vor fi concatenate ntr-unul singur, fisier_complet. Comanda more Comanda more ofer posibilitatea vizualizrii fiierelor text acestea sunt afiate ecran cu ecran. Exemplu: $ more /etc/passwd Comanda de mai sus afieaz coninutul fiierului /etc/passwd ecran dup ecran. Pentru defilarea liniilor pe ecran se pot folosi: tasta <SPACE> pentru defilarea unui ntreg ecran, tasta <ENTER> pentru defilarea unei singure linii i tasta <q> pentru terminarea afirii. Observaie: Doar acele fiiere care determin defilarea ecranului pot fi editate cu ajutorul editorului standard UNIX, vi (visual editor) n timpul vizualizrii fiierului prin intermediul comenzii more. O alternativ a comenzii more este comanda less, considerat de muli mai performant. Aceast comand este disponibil pe majoritatea distribuiilor Linux i UNIX; conine funcionaliti n plus precum deplasarea napoi. Spre deosebire de comanda more ncepe afiarea fiierului nainte ca acesta s fie ncrcat n ntregime n memorie.

50

Administrarea fiierelor i directoarelor

Comanda head Comanda head este utilizat pentru afiarea primelor n linii dintrunul sau mai multe fiiere. Dac se omite specificarea numrului de linii, se afieaz n mod implicit primele 10 linii din fiier. Comanda head este util n cazul n care se dorete vizualizarea rapid a primelor linii dintr-un fiier, fr a lua n considerare mrimea acestuia. Sintaxa general a comenzii este urmtoarea:
$ head [-n] fisier(e)

n figura 3.1 este prezentat un listing al comenzii head -5 lista (sunt afiate primele 5 linii ale fiierului lista).

Figura 3.1 Exemplu de listing al comenzii head

Comanda tail Comanda tail se folosete pentru afiarea ultimelor n linii dintr-un fiier text. n mod asemntor cu comanda head, dac se omite specificarea numrului de linii, se afieaz n mod implicit ultimele 10 linii din fiier. Comanda tail este util n cazul n care se dorete vizualizarea rapid a ultimelor intrri ntr-un fiier log de dimensiuni mari. Utilitarele de backup utilizeaz frecvent aceast metod de a scrie rezultatele ntr-un fiier log care ne arat pentru ce fiiere a fost fcut copia de siguran i cnd. Ultima linie dintr-un astfel de fiier log conine, de regul, numrul total de fiiere care au fost procesate i mesaje ce indic dac procesul de backup s-a ncheiat cu succes. Comanda tail poate fi folosit n dou moduri:
$ tail [-n] fisier(e)

sau
$ tail [+n] fisier(e)

51

UNIX

n primul caz sunt afiate ultimele n linii din fiierul specificat, pe cnd n cel de-al doilea caz se pornete afiarea ncepnd cu a n-a linie din fiier, pn la sfrit. n figura 3.2 este prezentat un listing al comenzii tail -5 lista (sunt afiate ultimele 5 linii ale fiierului lista).

Figura 3.2 Exemplu de listing al comenzii tail

3.2.4 Comenzi pentru compararea fiierelor Pentru a vedea dac dou fiiere sunt diferite sau nu putem folosi fie comanda wc, fie comanda diff. Dac specificul comenzii wc este de fapt altul, pentru a vedea ntr-adevr diferenele dintre cele dou fiiere trebuie s utilizm comanda diff. S prezentm n continuare cele dou comenzi. Comanda wc Comanda wc provine de la "word count" i este utilizat pentru a determina numrul de caractere, cuvinte sau linii coninute ntr-un fiier text. De asemenea, comanda mai poate fi utilizat atunci cnd dorim s comparm dou fiiere. Apelat fr opiuni, comanda wc ne ofer informaii despre numrul de linii, cuvinte word, octei din fiierul specificat. Folosind opiunile comenzii, se poate specifica s se afieze doar ce ne intereseaz. Formatul general i opiunile sunt: Opiunile sunt: -l numr liniile $ wc [-optiune] fisier(e) -w numr cuvintele -c numr octeii -m numr caracterele Spre exemplu, comanda wc l /etc/passwd poate afia: 26 passwd, ceea ce nseamn c fiierul /etc/passwd conine 26 de linii. Se pot specifica mai multe fiiere n cadrul comenzii wc, de asemenea se pot folosi i metacaractere. n figura 3.3 este prezentat un alt exemplu unde sunt afiate

52

Administrarea fiierelor i directoarelor

informaii referitoare la toate fiierele ce ncep cu litera l din directorul curent de lucru, precum i un total al acestor informaii.

Figura 3.3 Exemplu de listing al comenzii wc

Conform exemplului din figura 3.3, fiierul lista conine 17 linii, 90 de cuvinte i 610 octei, fiierul lista1 are 10 linii, 83 de cuvinte i 556 octei iar fiierul lista2 are 7 linii, 7 cuvinte i 54 de octei. n total, cele 3 fiiere nsumeaz 34 de linii, 180 de cuvinte i 1220 de octei. Comanda diff Comanda diff (difference) este utilizat pentru a compara dou fiiere text i a gsi diferenele dintre acestea. Formatul general al comenzii este:
$ diff [optiune] fisier1 fisier2

Opiunile acestei comenzi sunt: -i ignor diferenele ntre litere mari i litere mici (B este totuna cu b etc.); -c ofer o comparare detaliat i produce un listing pe larg a diferenelor, ncepnd cu identificarea fiierelor i datele de creare a respectivelor fiiere.

53

UNIX

Figura 3.4 Exemplu pentru comanda diff

Folosit cu opiunea -c, comanda diff afieaz informaiile detaliate ale celor dou fiiere, apoi o linie cu asterisk-uri (*) i liniile din fiierul fisier1, cu un semn minus (-) n faa liniilor ce difer de fisier2. Acelai format de afiare este valabil i pentru fisier2, cu semnul + n faa liniilor diferite fa de cele din fisier1. n figura 3.4 avem un exemplu de afiare detaliat pentru comanda diff, utilizat cu opiunea -c. Este afiat coninutul celor dou fiiere cu ajutorul comenzii cat, apoi listingul comenzii diff. Observaie. Dac nu exist diferene ntre cele dou fiiere (dac cele dou fiiere sunt identice) atunci comanda diff nu va afia nimic.

54

Administrarea fiierelor i directoarelor

3.2.5 Comenzi de creare i tergere pentru fiiere i directoare nainte de a descrie modalitatea de creare i tergere a fiierelor i directoarelor n UNIX, s reamintim regulile de stabilire a numelor pentru fiiere i directoare. Acestea sunt: Lungimea maxim a numelui unui fiier sau director nu poate depi 255 de caractere (cu toate acestea, numele prea lungi nu sunt recomandate); Se recomand utilizarea caracterelor alfanumerice mpreun cu dou caractere non-alfanumerice: liniua de unire (semnul minus -) i liniua de subliniere (caracterul underscore _ ); Se pot utiliza i alte caractere non-alfanumerice, dar nu este recomandat; Numele de fiiere conin de regul i o extensie, dar pot avea i mai multe extensii. Numele directoarelor nu au de regul extensii, dar acest lucru nu este interzis. Crearea fiierelor De regul, fiierele i directoarele sunt create de utilizatorii obinuii sau de ctre administratorul sistemului, dar exist i multe aplicaii care creeaz fiiere. O modalitate de a crea un fiier nou, fr coninut este aceea de a utiliza comanda touch. Sintaxa comenzii este urmtoarea:
$ touch fisier1 fisier2 fisierX

Cu ajutorul comenzii touch se pot crea chiar mai multe fiiere simultan, avnd n vedere c uneori trebuie s existe un anumit fiier nainte de a aduga informaii n el. Comanda touch poate fi utilizat i pentru a actualiza data i ora ultimului acces la fiier, care va reseta bitul archive, fcnd posibil din nou backup-ul (utilitarele de backup analizeaz de regul bitul archive pentru a actualiza copia fiierului respectiv sau nu). n figura 3.5 avem un exemplu prin care am creat 5 fiiere cu comanda touch. Dac fiierele respective nu exist, comanda touch le va crea, dac exist, va fi modificat doar data i ora timpului de acces/modificare.

55

UNIX

Figura 3.5 Exemplu de utilizare a comenzii touch

Crearea directoarelor n UNIX putem crea directoare cu ajutorul comenzii mkdir. Sintaxa comenzii este urmtoarea:
$ mkdir dir1 dir2 dirX

Cu ajutorul comenzii mkdir se pot crea chiar mai multe directoare simultan, cu condiia s avem drepturi (de acces) pentru a crea directoarele respective. n caz contrar, vom primi un mesaj de eroare de genul:
$ mkdir /usr/Test mkdir: Failed to make directory /usr/Test; Permission denied

Observaie. Pentru a crea o structur de directoare pe mai multe nivele trebuie s utilizm comanda mkdir cu opiunea -p. De exemplu, pentru a crea structura de directoare dir1/dir2/dir3 din directorul curent, vom utiliza comanda:
$ mkdir dir1/dir2/dir3

Considernd alt exemplu, comanda


$ mkdir p /home/razvan/temp/seminar_unix

creeaz un nou director intitulat /home/razvan/temp/seminar_unix, precum i toate directoarele intermediare necesare. Spre exemplu, dac exist doar directorul /home/razvan, atunci vor fi create directoarele temp (ca subdirector al directorului /home/razvan) i seminar_unix (ca subdirector al directorului /home/razvan/temp).

56

Administrarea fiierelor i directoarelor

tergerea fiierelor n UNIX putem terge fiiere cu ajutorul comenzii rm. Sintaxa comenzii este urmtoarea:
$ rm [-i] fisier(e)

Fiierele terse prin comanda rm sunt permanent terse, fr a exista posibilitatea recuperrii (doar cnd folosim o interfa grafic recuperarea mai este posibil), deci trebuie s fim ateni cum folosim aceast comand. Prin utilizarea opiunii -i avem posibilitatea de a fi atenionai nainte de tergerea fiierelor. Exemple:
$ rm student.txt $ rm stud1 stud2 stud3 $ rm -r TEMP

Se terge fiierul student.txt Se terg fiierele stud1, stud2 i stud3 Se terge directorul TEMP, mpreun cu tot coninutul su

tergerea directoarelor tergerea directoarelor se face fie cu comanda rm -r nume_director, fie cu rmdir. Pentru a putea ns terge un director cu comanda rmdir, trebuie ca directorul sau directoarele respective s fie goale, adic s nu conin nimic, nici un fiier sau subdirector. n caz contrar, vom obine un mesaj de eroare, ca n figura 3.6. Comanda rmdir poate fi folosit astfel:
$ rmdir dir1 dir2 dirX

Directoarele specificate trebuie s fie goale

Figura 3.6 Mesaj de eroare n cazul ncercrii de tergere a unui director care nu este gol cu comanda rmdir

57

UNIX

Pentru a terge directoare care nu sunt goale, trebuie s utilizm comanda rm -r, astfel:
$ rm -r [i] dir1 dir2 dirX

3.2.6 Comenzi de copiere, redenumire, mutare i redirectare Copierea fiierelor Copierea fiierelor i directoarelor se face cu ajutorul comenzii cp. O operaie uzual este aceea de copiere a unui fiier. Spre exemplu, dac trebuie modificat un fiier, vom face o copie de siguran a acestuia apoi vom face modificrile necesare. Dac dorim s ne ntoarcem la versiunea anterioar a fiierului, putem folosi copia fcut mai nainte. De regul, putem copia un fiier n dou moduri: fie l copiem n acelai director cu alt nume, fie l copiem n alt director cu acelai nume (putem s specificm i un nume diferit, totui). Pentru a copia fiierul n acelai director vom folosi comanda:
$ cp [-i] fis_sursa fis_destinatie

unde fis_sursa este numele fiierului surs iar fis_destinatie reprezint noul nume. n exemplul din figura 3.7 este copiat fiierul student cu noul nume student.bak. Am obinut n acest mod o copie a fiierului student.

Figura 3.7 Fiierul student este copiat cu noul nume student.bak n directorul curent

Pentru a copia un fiier n alt director (pstrnd acelai nume pentru fiier) vom folosi comanda:
$ cp [-i] fis_sursa dir_destinatie

58

Administrarea fiierelor i directoarelor

unde fis_sursa este numele fiierului surs iar dir_destinatie reprezint numele directorului destinaie. n acest caz numele fiierului se pstreaz, ns se poate specifica i alt nume. Comanda:
$ cp razvan temp

va copia fiierul razvan n subdirectorul temp (dac acesta exist). De asemenea, comanda:
$ cp /usr/razvan/student

va copia fiierul student din directorul /usr/razvan n directorul curent, iar


$ cp /usr/razvan/student /usr/serban

va copia fiierul student din directorul /usr/razvan n directorul /usr/serban. Comanda cp poate fi, de asemenea, folosit mpreun cu metacaracterele * i ? pentru a se copia mai multe fiiere deodat. Spre exemplu, n figura 3.8 se copiaz toate fiierele al cror nume ncepe cu litera l n subdirectorul temp.

Figura 3.8 Toate fiierele al cror nume ncep cu l sunt copiate n subdirectorul temp

Observaie. Comanda cp nu ine cont de existena fiierului destinaie ce urmeaz a fi copiat. De aceea, pentru a preveni tergerea accidental a vechilor fiiere, este util s folosim opiunea -i (interactive) ca msur de securitate. Utilizarea acestei opiuni face ca atunci cnd fiierul destinaie exist s fim ntrebai dac dorim copierea peste fiierul vechi sau nu, ca n figura 3.9.

59

UNIX

Figura 3.9 Utilizarea comenzii cp cu opiunea -i pentru prevenirea tergerii accidentale a fiierelor

Copierea directoarelor Copierea directoarelor se face cu ajutorul comenzii cp -r (recursive). Folosirea opiunii -r face ca directoarele s fie copiate cu tot cu subdirectoare, dac este cazul. Pentru copierea un director vom folosi comanda:
$ cp -r[i] dir_sursa dir_destinatie

unde dir_sursa este numele directorului surs iar dir_destinatie este numele directorului destinaie. n figura 3.10 este prezentat un exemplu de copiere a unui director folosind comanda cp -r.

Figura 3.10 Utilizarea comenzii cp -r pentru copierea unui director

Redenumirea fiierelor Att fiierele ct i directoarele pot fi redenumite cu ajutorul comenzii mv (move). Aceast comand poate fi utilizat cu dou sensuri: pentru a redenumi un fiier n cadrul unui director sau pentru a muta (nu copia!) un fiier dintr-un director n altul. Redenumirea unui fiier se face astfel:
$ mv [-i] fis_sursa fis_destinatie

60

Administrarea fiierelor i directoarelor

unde fis_sursa este numele vechi al fiierului iar fis_destinatie este noul nume al fiierului. Dac directorul este acelai att pentru surs ct i pentru destinaie, este vorba despre o redenumire; dac directoarele difer, avem de-a face cu o mutare a fiierului dintr-un director n altul. n figura 3.11 avem un exemplu de redenumire: fiierul lista este redenumit n lista_nou.

Figura 3.11 Redenumirea fiierului lista n lista_nou

Pentru a muta un fiier n alt director, vom folosi urmtoarea sintax:


$ mv [-i] fis_sursa dir_destinatie

unde se specific numele fiierului surs (fis_sursa) i numele directorului destinaie (dir_destinatie). n figura 3.12 fiierul lista2 este mutat n directorul temp.

Figura 3.12 Mutarea fiierului lista2 din directorul curent n subdirectorul temp

Redenumirea directoarelor Redenumirea unui director se face astfel:


$ mv [-i] dir_sursa dir_destinatie

61

UNIX

unde dir_sursa reprezint vechiul nume al directorului iar dir_destinatie este noul numele al directorului. n figura 3.13 avem un exemplu de redenumire a unui subdirector n cadrul aceluiai director (dir1 este redenumit n dir_nou).

Figura 3.13 Redenumirea unui subdirector n cadrul aceluiai director

n figura 3.14 este considerat un exemplu n care subdirectorul nu este redenumit n cadrul aceluiai director, ci este mutat n alt director (directorul dir_nou este mutat n directorul temp).

Figura 3.14 Mutarea unui subdirector n alt director

Alte exemple:
$ mv student.txt student.doc

Se redenumete fiierul student.txt cu noul nume student.doc

62

Administrarea fiierelor i directoarelor

$ mv student temp

Se redenumete fiierul student n temp (de remarcat este faptul c, dac temp este un director, fiierul student va fi mutat n acel director). Se mut fiierul student n directorul /home/serban/temp

$ mv student /home/serban/temp

Observaie. Ca i n cazul comenzii cp, este bine s prevenim tergerea (rescrierea) accidental a vechilor fiiere i directoare, prin utilizarea opiunii -i (interactive) ca msur de securitate. Utilizarea acestei opiuni face ca atunci cnd un fiier sau director cu acelai nume exist s fim ntrebai dac dorim suprascrierea sau nu, ca n figura 3.15. Vom introduce n (no) dac nu dorim acest lucru sau y (yes) dac dorim suprascrierea.

Figura 3.15 Exemplu de utilizare a comenzii mv -i

Redirectarea intrrilor i ieirilor Sistemul de operare UNIX ofer o facilitate deosebit de util de redirectare a intrrilor sau/i ieirilor unei comenzi. Toate operaiile ce se desfoar ntr-un computer au intrri i/sau ieiri. De exemplu, tastatura reprezint fiierul standard de intrare (denumit stdin) iar monitorul (ecranul) reprezint fiierul standard de ieire (denumit stdout). Toate comenzile UNIX au un fiier standard de intrare (input) i un fiier standard de ieire (output). Intrarea este, de regul, tastatura iar ieirea este, de regul, ecranul monitorului. Cu ajutorul operatorilor de redirectare se pot schimba ns aceste setri implicite. Redirectarea ieirii se face utiliznd operatorul >, redirectarea intrrii se face cu ajutorul operatorului < iar redirectarea erorilor (mesajelor de eroare obinute n urma rulrii unor comenzi) se face prin utilizarea combinaiei 2>. n continuare este prezentat formatul general al redirectrii. Fiierul aflat dup simbolul de redirectare poate fi un fiier text sau un fiier asociat unui dispozitiv (fiier device), avnd n vedere c n UNIX toate dispozitivele sunt definite sub form de fiiere. Spre exemplu, ecranul

63

UNIX

monitorului este referit de fiierul /dev/console, unitatea de floppy disc este referit de /dev/fd iar imprimanta de /dev/lp. Formatul general pentru redirectare este:
$ comanda simbol_redirectare fisier

unde comanda este numele comenzii, simbol_redirectare este unul dintre simbolurile de redirectare existente iar fisier este numele unui fiier text sau numele unui fiier generic asociat unui dispozitiv UNIX. Redirectarea intrrii Conform formatului general de mai sus, pentru redirectarea intrrii unei comenzi vom folosi urmtoarea sintax:
$ comanda < nume_fisier

Un exemplu de utilizare al redirectrii intrrii este:


$ mail serban < lista

n care utilizatorului serban i se trimite prin email coninutul fiierului lista. Redirectarea ieirii Redirectarea ieirii unei comenzi determin crearea unui nou fiier n modul urmtor:
$ comanda > nume_fisier

Un exemplu de utilizare al redirectrii ieirii este:


$ ls > lista

n care este creat fiierul lista ce conine ieirea comenzii ls. Exemplul este prezentat i n figura 3.16.

64

Administrarea fiierelor i directoarelor

Figura 3.16 Exemplu de redirectare a ieirii

Observaie. Pentru a redirecta ieirea unei comenzi poate fi folosit i operatorul >> care are acelai efect cu > dar este folosit pentru a aduga ieirea la sfritul unui fiier existent, n loc de a suprascrie fiierul. Redirectarea erorilor Redirectarea erorilor generate de comenzi este util atunci cnd se dorete analiza lor. Adminstratorii de sistem i programatorii fac acest lucru atunci cnd scriu shell-scripturi de administrare. Pentru a redirecta fiierul standard de eroare, se folosete ca operator de redirectare combinaia 2>, astfel:
$ comanda 2> nume_fisier

Se creeaz un nou fiier sau se suprascrie peste cel existent.

n exemplul din figura 3.17 am redirectat erorile n fiierul eroare, care este afiat n continuare. Eroarea provine din faptul c am ncercat s copiem un director cu comanda cp fr opiunea -r.

Figura 3.17 Exemplu de redirectare a erorilor

65

UNIX

Observaie. Am putea include aici i operatorul pipe ( | ) care se folosete atunci cnd ieirea unei comenzi este redirectat ca intrare pentru o alt comand. Efectul folosirii unei secvene pipe este acela al scrierii unui mic program, deoarece se pot nirui pn la 20-30 de comenzi ntr-o astfel de secven pipe. Spre exemplu, dac dorim afiarea ecran cu ecran a fiierelor din directorul curent (atunci cnd avem multe fiiere n director) putem folosi secvena pipe urmtoare:
$ ls -la | more

Crearea de legturi Pentru a salva spaiu pe disc i a nu face o copie a unui fiier, de multe ori putem crea o legtur (link) ctre acesta. n acest mod putem accesa fiierul specificat i din alte locaii de pe hard disk. Crearea de astfel de fiiere tip legtur este util atunci cnd mai muli utilizatori trebuie s lucreze asupra aceluiai fiier (un proiect la care lucreaz o echip de programatori, de exemplu) sau atunci cnd se dorete o referin la un fiier utilizndu-se un nume mai scurt. Comanda folosit este comanda ln (link) iar formatul general al este:
$ ln fisier fisier_nou

Comanda anterioar creaz un link pentru fiierul fisier n directorul curent, cu numele fisier_nou; pentru crearea unei legturi n alt director dect cel curent, vom folosi formatul:
$ ln fisier director/fisier_nou

Observaie. Atunci cnd este creat un fiier, este creat o legtur dintre director i acel fiier. Numrul de legturi pentru fiecare fiier este de cel puin 1 (referina proprie). Numrul de legturi este afiat n cea de-a doua coloan a listingului comenzii ls -l. De fiecare dat cnd este creat o legtur ctre un fiier, numrul de legturi ale acelui fiier este incrementat. n figura 3.18 avem un exemplu n care este listat numrul de legturi (1) ctre fiierul test, este creat o legtur ctre fiierul test i apoi vedem c numrul de legturi a devenit 2.

66

Administrarea fiierelor i directoarelor

Figura 3.18 Exemplu de creare a unei legturi cu comanda ln

Observaie. Pentru a terge un fiier de tip legtur se utilizeaz aceeai comand rm, care va terge legtura ctre fiier dar nu i fiierul original. Odat cu tergerea fiierului de tip link, numrul de legturi al fiierului original este decrementat cu 1. 3.3 Comenzi legate de hard discuri i partiii

n ultimii ani hard discurile au devenit deosebit de ncptoare astfel nct majoritatea sistemelor de operare le pot administra cu relativ uurin. Majoritatea sistemelor de fiiere existente au o dimensiune minim a fiierelor i un numr maxim de fiiere i/sau directoare ce pot fi stocate pe un dispozitiv fizic, ceea ce vine n contradicie cu dimensiunile din ce n ce mai mari ale hard discurilor. Pentru a rezolva aceast problem, sistemele de operare moderne ofer posibilitatea mpririi discului fizic n mai multe discuri virtuale ce se numesc partiii. i sistemele de operare Windows i Macintosh ofer posibilitatea de partiionare logic a discurilor, cu toate c, pentru sistemele desktop (la care aceste dou sisteme de operare sunt folosite cu predilecie) aceast facilitate (i, pe de alt parte, protecie) nu este att de imperioas ca n cazul unui sistem utilizat pe post de server ntr-o reea. Lucrurile stau diferit n lumea UNIX fa de cea Windows; astfel, ntr-un sistem UNIX pot exista sute de discuri virtuale (transparent fa de utilizatorul obinuit) iar directorul home se poate afla pe dou sau trei partiii diferite. Unul dintre motivele acestei strategii UNIX este acela c programele ce ruleaz au deseori tendina de a lsa n urma lor fiiere de tip log (iniializare) sau temp (temporare) care pot umple n mod inutil spaiul liber de pe hard disc. Mai mult ns, trebuie s avem o grij deosebit cnd este vorba despre spaiul liber de pe hard disc deoarece sistemul de operare UNIX i diminueaz considerabil performanele atunci cnd duce lips de spaiu liber. n acest sens trebuie avute permanent n vedere dimensiunile partiiilor, fiierele

67

UNIX

de dimensiuni mari i modalitatea de control al acestora nainte de a deveni o problem pentru sistemul de operare. Pentru controlul asupra gradului de ocupare a sistemului de fiiere putem utiliza comenzile df, du i dfspace. Comanda df Comanda df provine de la disk free i este utilizat pentru a determina mrimea spaiului liber de pe disc. Exemple: # df Simplul apel al comenzii df va afia spaiul liber (blocuri i i-noduri) pentru toate sistemele de fiiere montate. Chiar i acest apel al comenzii ne ofer o serie de informaii utile:
Filesystem /dev/sda5 /dev/sda1 /dev/sda3 none /dev/sdb1 /dev/sdb2 1k-blocks 380791 49558 16033712 256436 17245524 253871 Used 108116 7797 62616 0 1290460 88384 Available 253015 39202 15156608 256436 15079036 152380 Use% 30% 17% 1% 0% 8% 37% Mounted on / /boot /home /dev/shm /usr /var

# df / Afieaz spaiul liber din directorul specificat: / (root). # df -kvi Afieaz spaiul liber pe toate sistemele de fiiere montate msurat n kilobii i i-noduri. Comanda df difer cte puin de la o variant UNIX la alta. Exist o serie de opiuni cu care aceast comand poate fi apelat, n funcie i de varianta sistemului de operare, cum spuneam mai nainte. Spre exemplu, Linux are opiunea h pentru aceast comand, care produce urmtorul output: # df h
Filesystem /dev/sda5 /dev/sda1 /dev/sda3 none /dev/sdb1 /dev/sdb2 Size 372M 48M 21G 250M 22G 248M Used 106M 7.7M 62M 0 1.3G 87M Avail 247M 38M 20G 250M 20G 148M Use% 30% 17% 1% 0% 8% 37% Mounted on / /boot /home /dev/shm /usr /var

Formatul folosit aici este mai inteligibil: putem vedea cu uurin c att /home ct i /usr au un spaiu neutilizat de cte 20 GB!. Spre deosebire de alte variante UNIX, Solaris 8 are o comand df ce ne ofer informaii foarte diferite de output-ul de mai sus. Comanda df se

68

Administrarea fiierelor i directoarelor

concentreaz mai degrab asupra fiierelor i a sistemului de fiiere dect asupra discurilor i a spaiului utilizat de pe acestea:
# df / (/dev/dsk/c0d0s0 ): 827600 blocks 276355 files /boot (/dev/dsk/c0d0p0:boot): 17584 blocks -1 files /proc (/proc ): 0 blocks 1888 files /dev/fd (fd ): 0 blocks 0 files /etc/mnttab (mnttab ): 0 blocks 0 files /var/run (swap ): 1179992 blocks 21263 files /tmp (swap ): 1179992 blocks 21263 files /export/home (/dev/dsk/c0d0s7 ): 4590890 blocks 387772 files

n acest caz este mai greu de observat ce se ntmpl; putem observa ns c informaiile prezentate sunt, n ordine, urmtoarele: punctul de montare, identificatorul dispozitivului, dimensiunea acestuia n blocuri de cte 1KB i numrul de fiiere existente pe acel dispozitiv. Din acest listing nu ne putem da seama ns care este procentul de spaiu ocupat pe disc din total; aceast comand apelat fr nici o opiune nu ne ofer informaii foarte importante din punct de vedere al administratorului. Exist ns opiunea t (totals), care ofer un listing mai relevant i informaii utile unui administrator de sistem:
# df -t / /boot /proc /dev/fd /etc/mnttab /var/run /tmp /export/home (/dev/dsk/c0d0s0 ): 827600 blocks 276355 files total: 2539116 blocks 320128 files (/dev/dsk/c0d0p0:boot): 17584 blocks -1 files total: 20969 blocks -1 files (/proc ): 0 blocks 1888 files total: 0 blocks 1932 files (fd ): 0 blocks 0 files total: 0 blocks 258 files (mnttab ): 0 blocks 0 files total: 0 blocks 1 files (swap ): 1180000 blocks 21263 files total: 1180008 blocks 21279 files (swap ): 1180000 blocks 21263 files total: 1180024 blocks 21279 files (/dev/dsk/c0d0s7 ): 4590890 blocks 387772 files total: 4590908 blocks 387776 files

Comanda dfspace Comanda dfspace este o comand specific sistemelor SCO UNIX, oferind o modalitate de vizualizare a spaiului liber de pe disc mai uor de neles fa de comanda clasic df.

69

UNIX

Comanda du Pentru a determina spaiul ocupat de un director din sistemul de fiiere UNIX se poate folosi comanda du (disk usage). Exemple: $ du Apelat fr nici o opiune, comanda du ne arat spaiul ocupat de ctre directorul curent pe disc, msurat n blocuri; $ du -k Opiunea k ne va arta spaiul ocupat n blocuri de cte 1KB; $ du /home/razvan Aceast comand ne prezint spaiul ocupat de ctre subdirectorul /home/razvan. $ du ks /home/razvan/* Afieaz un sumar al fiecrui subdirector din directorul /home/razvan. De regul, comanda du genereaz un listing destul de lung atunci cnd este vorba despre multe fiiere i directoare existente n directorul pentru care se face afiarea. S considerm urmtorul exemplu:
12 16 412 36 32 196 48 16 1232 4 8 1848 3092 160 136 10464 76 52 2792 24 2872 2880 554 184 14 140 360 196 86 20 1110 6848 190 13974 28484 ./.kde/Autostart ./.kde ./bin ./CraigsList ./DEMO/Src ./DEMO ./elance ./Exchange ./Gator/Lists ./Gator/Old-Stuff/Adverts ./Gator/Old-Stuff ./Gator/Snapshots ./Gator ./IBM/i ./IBM/images ./IBM ./CBO_MAIL ./Lynx/WWW/Library/vms ./Lynx/WWW/Library/Implementation ./Lynx/WWW/Library/djgpp ./Lynx/WWW/Library ./Lynx/WWW ./Lynx/docs ./Lynx/intl ./Lynx/lib ./Lynx/lynx_help/keystrokes ./Lynx/lynx_help ./Lynx/po ./Lynx/samples ./Lynx/scripts ./Lynx/src/chrtrans ./Lynx/src ./Lynx/test ./Lynx .

70

Administrarea fiierelor i directoarelor

Prima valoare de pe fiecare linie reprezint dimensiunea fiecrui director. Aceast dimensiune nsumeaz dimensiunile tuturor fiierelor i subdirectoarelor din acel director. Astfel, directorul Lynx are dimensiunea de 13974, incluznd subdirectorul Lynx/src (6848) care, la rndul su conine subdirectorul Lynx/src/chrtrans de dimensiune 1110. Ultima linie reprezint dimensiunea total nsumat a fiierelor, directoarelor i subdirectoarelor: 28484. Care este unitatea de msur? Din pcate, aceasta depinde de implementare; de exemplu, n cazul Linux Red Hat 7.2, pagina de manual pentru comanda du ne arat c unitatea de msur nu este explicit specificat! Exist, din fericire opiunea k care ne permite afiarea dimensiunilor n blocuri de cte 1KB, deci liniile urmtoare: # du k | tail 1 28474 . ne lmurete c este vorba despre 28474 KB, deci aproximativ 27,8 MB (28474 / 1024). 3.4 Cutarea fiierelor pe disc

n momentul cnd dorim s cutm un fiier pe disc este foarte util comanda find. Comanda find este una dintre cele mai puternice comenzi ale sistemului de operare UNIX. Sintaxa de baz a comenzii este:
$ find cale_de_cautare criteriu_de_cautare [comanda]

Comanda find poate fi folosit pentru a cuta fiiere pe hard discurile locale sau chiar i pe sisteme la distan. Deoarece operaia de cutare poate solicita destul de mult procesorul, trebuie s ncercm s ncepem cutarea din directorul ct mai apropiat de fiier; doar n cazul n care nu avem nici un indiciu legat de posibila localizare a fiierului vom ncepe cutarea din rrcin ( / ). Putem face cutri ale fiierelor UNIX folosind mai multe criterii de cutare printre care: numele parial sau ntreg al fiierului, dimensiune, dat, drepturi de acces, dreptul de proprietate, etc. Calea de cutare specificat n comand (conform formatului general de mai sus) poate fi semnul special tilda (~) ce n UNIX reprezint directorul home al utilizatorului curent, punctul ( . ) ce reprezint directorul curent sau o cale ntreag de directoare, relativ sau absolut. Ultimul parametru al comenzii find l reprezint comenzi opionale ce pot fi inserate la sfrit.

71

UNIX

n mod implicit, opiunile de cutare sunt tratate ca o cerere i, astfel nct toate expresiile introduse trebuie s fie prezente (adevrate). De asemenea, poate fi folosit opiunea -o (or) ntre expresii pentru a specifica criterii de cutare de tip sau care sunt adevrate dac cel puin unul dintre criterii este adevrat. Majoritatea expresiilor de cutare necesit o valoare ce trebuie gsit i uneori sunt folosite metacaracterele n cadrul argumentelor comenzii. Tabelul 3.19 ne nfieaz cteva expresii de cutare; aceste expresii sunt evaluate de ctre comanda find ca fiind false sau adevrate. Criterii de cutare pentru comanda find
Tabelul 3.19
Expresia name nume_fisier type tip_fisier mtime [+|-]n Semnificaie Cutare dup nume Cutare dup tip Cutare dup data/ora ultimei modificri Cutare dup data/ora ultimului acces la fiier Cutare dup permisiuni de acces Cutare dup permisiuni de acces Aciunea Caut toate fiierele cu numele specificat n nume_fisier. Caut toate fiierele cu tipul specificat de tip_fisier. Caut toate fiierele a cror modificare este mai veche (+) sau mai nou (-) dect n zile. Caut toate fiierele a crui acces este mai vechi (+) sau mai nou (-) dect n zile. Caut toate fiierele care satisfac criteriul de permisiuni specificat (folosind notaia octal). Caut toate fiierele care au dimensiunea exact, mai mare (+) sau mai mic (-) dect n (n reprezint blocuri de 512 octei, sau caractere dac este urmat de c).

atime [+|-]n

perm mod

size [+|-]n[c]

Prezentm n continuare cteva exemple:


$ find / -name ls -print

$ find / -name seminar_unix\ -type f -print $ find /usr -name hello -type\ f -print

Se caut ncepnd din rdcin dup nume fiierul ls i se va afia rezultatul cutrii (-print) Se caut din rdcin fiierul cu numele seminar_unix. Dac este gsit, se va afia pe ecran locaia sa Se caut ncepnd din directorul usr dup nume fiierul hello i se va afia rezultatul cutrii

72

Administrarea fiierelor i directoarelor

$ find /usr -name sem*\ -type f -print $ find ~ -name *gif\ -type f -print

Se caut din directorul usr toate fiierele al cror nume ncepe cu sem. Se caut plecnd din directorul home toate fiierele al cror nume se termin cu gif.

n figura 3.20 este prezentat alt exemplu. Se apeleaz comanda find fr nici un argument, fapt ce determin afiarea fiierelor din directorul curent, apoi se caut ncepnd cu directorul curent fiierele al cror nume se termin n .bak, care apoi se terg, folosindu-se opiunea interactiv ok.

Figura 3.20 Exemplu mai complex de utilizare a comenzii find

n figura 3.21 este prezentat alt exemplu n care se caut ncepnd cu directorul curent fiierele deinute de un anumit utilizator (daemon) i se execut comanda ls care este ns redirectat ntr-un fiier (daemon_files) pentru a fi accesat mai trziu. Comanda urmtoare:
$ find . -name rc.conf -exec chmod o+r {} \;

va cuta n directorul curent i toate subdirectoarele sale toate fiierele cu numele rc.conf pentru care va executa comanda chmod o+r.

73

UNIX

Argumentul '{}' va insera fiecare fiier gsit n linia de comanda chmod, iar \; semnific ncheierea liniei de comand exec. Rezultatul comenzii va fi acela c toi utilizatorii vor avea drepturi de citire asupra fiierelor rc.conf. Un exemplu mai complex de cutare a fiierelor utiliznd operatorul -o l ntlnim n cazul urmtor:
$ find /usr/src -not\( -name "a*" -o -name "a.*" \) '{}' \; -print

Aceast comand va cuta n directorul /usr/src precum i n toate subdirectoarele acestuia toate fiierele, cu excepia celor de forma a* i a.*. Argumentele implicate aici sunt: -not semnific negarea expresiei ce urmeaz \( semnific nceputul unei expresii complexe \) semnific sfritul unei expresii complexe -o semnific o operaie de sau logic ntr-o expresie complex

Figura 3.21 Alt exemplu de utilizare a comenzii find

Comanda urmtoare:
$ find . -exec grep infocib.ase.ro {} \; -print

74

Administrarea fiierelor i directoarelor

va cuta n directorul curent i n toate subdirectoarele sale i va afia toate fiierele ce conin irul de caractere specificat (infocib.ase.ro). Aceast comand poate fi util n cazul n care dorim s modificm irul de caractere specificat cu alt ir de caractere pentru toate fiierele dintr-un director (spre exemplu, putem modifica infocib.ase.ro cu www.infocib.ase.ro). n acest caz vom redirecta ieirea ctre o comand sed pentru nlocuirea irului de caractere. 3.5 Cutarea irurilor de caractere n fiiere

Comanda grep Comanda grep (global regular expression print) este folosit pentru cutarea unor iruri de caracactere ntr-unul sau mai multe fiiere sau n ieirile generate de comenzi. irurile de caractere pot conine pe lng caractere alfanumerice i spaii sau diferite semne de punctuaie, cu condiia s fie ncadrate de apostrofuri (). De regul, comanda grep este utilizat ca filtru pentru ieirile altor comenzi. Comanda grep face distincie ntre litere mari i litere mici n mod implicit; dac dorim s schimbm aceast setare implicit, putem folosi opiunea -i. Opiunea -v caut toate liniile ce nu se potrivesc ablonului specificat. Formatul general al comenzii grep este urmtorul:
$ grep [optiuni] sir_caractere nume_fisier

unde sir_caractere reprezint irul de caractere cutat iar nume_fisier fiierul n care se va face cutarea. Vom prezenta n continuare cteva exemple de utilizare a comenzii grep:
$ grep razvan /etc/passwd

Aceast comand caut toate apariiile irului de caractere "razvan" n fiierul "/etc/passwd". Toate liniile ce conin acest ir de caractere vor fi afiate pe ecran.
$ grep stud *

75

UNIX

Aceast comand caut toate apariiile irului de caractere "stud" n toate fiierele din directorul curent. Se poate folosi astfel comanda grep n cazurile n care cutm un fiier al crui nume l-am uitat dar tim un ir de caractere coninut de acel fiier. De asemenea, putem specifica opiunea -n pentru a afia i numrul liniei pe care se afl irul de caractere cutat. Cunoscnd numrul liniei, putem apoi cu un editor de texte s deschidem fiierul respectiv pentru editare la linia respectiv. n figura 3.22 se caut irul de caractere test n fiierele din directorul curent. Se gsete fiierul lista, ce conine pe linia 11 irul de caractere cutat.

Figura 3.22 Utilizarea comenzii grep cu opiunea -n

Comanda grep poate fi folosit pentru a cuta iruri de caractere ce corespund unor abloane. Metacaracterele ce pot fi utilizate n acest caz sunt:
. (punctul) * (asterisc) Acioneaz pe post de orice caracter i poate fi utilizat de mai multe ori Este folosit pentru zero, unul sau mai multe caractere Este folosit pentru a specifica nceputul liniei (se utilizeaz cnd se dorete afiarea liniilor care ncep cu un anumit ir de caractere) Este folosit pentru a specifica sfritul liniei (se utilizeaz cnd se dorete afiarea liniilor care se termin cu un anumit ir de caractere) Este folosit pentru a specifica shell-ului s trateze urmtorul caracter special dup \ n mod normal Verific apariia unei secvene de caractere din domeniul specificat

^ (caret) $ (dolar) \ (backslash) [] (paranteze ptrate)

76

Administrarea fiierelor i directoarelor

n figura 3.23 avem un exemplu n care comanda grep este conectat prin pipe comenzii ls:

Figura 3.23 Conectarea comenzii grep prin pipe comenzii ls

Rezultatul comenzii de mai sus va fi afiarea directoarelor din directorul curent, avnd n vedere c n listingul comenzii ls -l, caracterul d la nceput specific faptul c fiierul respectiv este director. 3.6 Sortarea fiierelor

n UNIX exist posibilitatea de sortare a liniilor unui fiier sau a ieirii unei comenzi folosind comanda sort. Comanda sort Comanda sort ofer o modalitate rapid de organizare a datelor n ordine alfabetic sau numeric. Comanda sort utilizeaz setul de caractere ASCII drept ordine de sortare, analiznd cuvintele (irurile de caractere) de la stnga la dreapta, caracter cu caracter. Comanda sort poate face sortarea pe mai multe nivele, sau pe anumite cmpuri, avnd intrare standard i oferind ieire standard. Sintaxa general a comenzii este urmtoarea:

$ sort [optiuni] [fisier_intrare]

77

UNIX

n continuare sunt prezentate cteva opiuni ce pot fi folosite cu comanda sort:


-n (+|-)n

Permite o sortare numeric ncepe (+) sau se termin (-) cu cmpul ce urmeaz dup al n-lea separator. Separatorul implicit este spaiul Inverseaz ordinea de sortare Utilizat pentru a ignora diferena ntre litere mari i litere mici n acest caz se utilizeaz ordinea de dicionar; sunt comparate doar literele, cifrele i caracterele white spaces iar toate celelalte simboluri sunt ignorate Sorteaz primele trei caractere ale cmpului drept prescurtri ale numelor lunilor anului Rezultatul comenzii va fi stocat n fiierul specificat de nume_fisier, n loc s fie afiat pe ecran

-r -f

-d +nM -o nume_fisier

n exemplul din figura 3.24 se folosete comanda sort pentru a realiza o sortare invers, numeric, dup alt cmp dect cel implicit (primul). Rezultatul comenzii este afiarea fiierelor al cror nume ncepe cu litera e n ordine descresctoare a dimensiunii lor.

Figura 3.24 Exemplu de utilizare a comenzii sort

78

Administrarea fiierelor i directoarelor

3.7

Arhivarea i compresia fiierelor

3.7.1 Comanda tar Comanda tar (tape archive) poate fi folosit pentru crearea de arhive pe suporturi magnetice (benzi sau discuri). Poate fi folosit, de asemenea, pentru crearea arhivelor de uz general pentru transferul fiierelor n reele, Internet, etc. Comanda tar poate fi utilizat i pentru crearea de copii de siguran pentru fiiere, fiind o comand standard pentru toate versiunile de UNIX. Dezvoltat iniial pentru lucrul cu arhive pe band magnetic, comanda tar poate copia ns fiiere oriunde (hard disc, floppy disc sau alte uniti de stocare externe). Comanda tar poate crea o arhiv a unui singur fiier, dar ea este, de regul, folosit pentru arhivarea de directoare ntregi ntr-un singur fiier care va fi folosit mai trziu dac este cazul. Observaie. Comanda tar nu asigur i compresia fiierelor n timp ce creeaz arhiva (precum utilitarele winzip, pkzip, winrar, arj, ace, etc. pentru PC). Cele mai ntlnite opiuni ale comenzii tar sunt c, t i x. Spre deosebire de majoritatea comenzilor UNIX, aceste opiuni nu trebuie neaprat precedate de semnul minus (-). Sintaxa general a comenzii este urmtoarea:
$ tar functie [modificator] [fis_iesire] nume_fis |nume_dir

Funciile comenzii tar sunt urmtoarele: c (create) - este utilizat pentru a crea o arhiv dintr-un singur fiier sau director sau din mai multe fiiere sau directoare; t (table of contents) - este utilizat pentru a vedea un tabel cu coninutul arhivei. Acest tabel reprezint un listing cu fiierele ce compun fiierul arhiv de tip tar; x (extract) - este utilizat pentru a extrage fiiere dintr-o arhiv i a le separa din nou. Fiierul arhiv tar exist i dup aceast extragere. Cei mai utilizai modificatori ai funciilor sunt: f (file) - permite specificarea unui fiier tar pentru creare (c), extragere (x) sau vizualizarea tabelei de coninut (t); v (verbose) - execut comanda n modul vorbre care permite s vedem rezultatele detaliate ale comenzii tar pe msur ce aceasta ruleaz.

79

UNIX

Prezentm n continuare cteva exemple:


$ tar cvf /dev/rct0 /home

Comanda anterioar va crea o arhiv de tip tar pe dispozitivul /dev/rct0 (band magnetic), copiind toate fiierele i subdirectoarele din directorul /home.
$ tar cvf /dev/fd0 /home/razvan

Aceast comand va crea o arhiv tar pe discheta /dev/fd0, copiind toate fiierele i subdirectoarele din directorul /home/razvan.
$ tar cvf /tmp/home.tar /home

Comanda anterioar va crea o arhiv de tip tar n fiierul /tmp/home.tar, copiind tot coninutul directorului /home.
$ tar tvf dir.tar

Aceast comand permite vizualizarea tabelului cu coninut al arhivei specificate, n modul verbose, ce afieaz n detaliu caracteristicile fiierelor, printre care drepturile de acces i dimensiunea. n figura 3.25 este prezentat listingul obinut n urma execuiei comenzii anterioare. 3.7.2 Comanda compress O operaie frecvent pe un sistem UNIX este aceea de a arhiva fiierele care nu au fost folosite o perioad ndelungat de timp i apoi a le compresa pentru a reduce spaiul ocupat pe hard disc. n acest sens, se poate folosi comanda compress. Toate fiierele, inclusiv cele arhivate cu comanda tar, pot fi compresate (sau comprimate). Operaia de compresie (comprimare) a fiierelor este o operaie deosebit de util deoarece reduce spaiul ocupat pe hard disc i n acelai timp face ca fiierele comprimate s fie disponibile pentru o utilizare ulterioar.

80

Administrarea fiierelor i directoarelor

Compresia fiierelor pe un sistem UNIX poate reduce dimensiunea unui fiier cu 20% pn 80%, n funcie de tipul fiierului. Dac utilitarul de compresie ajunge la concluzia c fiierul nu poate fi comprimat sau nu exist nici o reducere n dimensiune a fiierului, atunci fiierul va rmne nemodificat. Fiierele comprimate cu comanda compress sunt nlocuite cu un fiier cu acelai nume cu cel original, dar care are extensia .Z (atenie, litera mare Z). Comanda compress ofer posibilitatea compresiei mai multor fiiere o dat, precum i folosirea metacaracterelor pentru specificarea mai multor fiiere. Prezentm n continuare cteva exemple:
$ compress /tmp/home.tar

Aceast comand comprim fiierul /tmp/home.tar, nlocuindu-l cu un fiier denumit /tmp/home.tar.Z.

Figura 3.25 Exemplu de utilizare a comenzii tar


$ compress -v install.log

81

UNIX

Aceast comand este apelat cu opiunea verbose i va afia numele fiierului de intrare (install.log), numele fiierului de ieire (install.log.Z) precum i procentul de compresie obinut. Observaie. Fiierele comprimate sunt considerate fiiere binare, de aceea coninutul lor nu poate fi vizualizat folosind comenzile cat sau more. 3.7.3 Decompresia fiierelor Fiierele compresate pot fi aduse n starea iniial comprimrii prin utilizarea comenzii duale comenzii compress, uncompress. Deoarece fiierele comprimate nu pot fi utilizate sub aceast form, ele trebuie aduse n starea de dinaintea comprimrii, operaia purtnd numele de decomprimare sau decompresare. Formatul general al comenzii uncompress este urmtorul:
$ uncompress [optiuni] nume_fisier

unde se pot specifica anumite opiuni i numele fiierului (nume_fisier) pe care vrem s l decompresm. Nu este neaprat necesar s specificm extensia .Z, avnd n vedere c aceast comand caut automat fiierul cu extensia implicit .Z. De asemenea, se pot decompresa mai multe fiiere o dat, folosind metacaracterele * i ?. Pentru a vizualiza coninutul unui fiier comprimat fr a face efectiv decomprimarea, se poate folosi opiunea -c. De exemplu, pentru a vizualiza coninutul unui fiier comprimat cu numele install.log.Z putem folosi comanda (am utilizat comanda more pentru cazul n care fiierul decomprimat va aprea pe mai multe ecrane):
$ uncompress -c install.log.Z | more

3.7.4 Comanda jar Comanda jar (Java archive) este asemntoare cu comanda tar, dar nglobeaz i compresia fiierului ntr-un singur pas. Fiierele arhivate sunt compresate prin intermediul aplicaiei Java jar ntr-o arhiv de acest tip. Utilitarul jar reprezint un instrument de arhivare bazat pe formatele de compresie zip i zlib. Comanda jar este o comand standard pentru sistemul de operare Solaris dar este disponibil pe orice sistem ce are instalat maina

82

Administrarea fiierelor i directoarelor

virtual Java (JVM - Java Virtual Machine). Sintaxa general a comenzii este foarte asemntoare cu aceea a comenzii tar. Opiunile disponibile pentru comanda jar sunt urmtoarele:
c t x F V

Creeaz o nou arhiv jar Listeaz coninutul fiierului jar Extrage fiierele specificate din arhiva jar Specific fiierul jar magnetic (/dev/rmt/x) (/tmp/fisier.jar) sau banda

Specific execuia n modul verbose 3.7.5 Alte utilitare pentru compresie

Exist o sumedenie de utilitare pentru compresie/decompresie ce pot fi folosite pe UNIX. Cele mai populare sunt utilitarele gzip, gunzip i gzcat (ce deriv din proiectul GNU i sunt disponibile pe majoritatea versiunilor de UNIX). Exist, de asemenea, i programele zip i unzip (similare variantelor pentru Windows) care pot fi utilizate pentru compresia, respectiv decompresia fiierelor. Prezentm n continuare utilitarele gzip, gunzip i gzcat. Comanda gzip Sintaxa general a comenzii este:
$ gzip [-acdfhlLnNqrtvV19] [-S sufix] [nume_fisier ...]

Utilitarul gzip folosete algoritmul de compresie Lernel-Ziv (LZ77) pentru a reduce dimensiunea fiierelor specificate n comand. Pentru fiecare fiier specificat, fiierul original este ters i nlocuit cu varianta sa compresat ce are acelai nume cu fiierul original cruia i se adaug extensia .gz. Fiierul compresat are aceleai proprieti referitoare la modurile de acces, permisiuni, data/ora de acces, data/ora ultimei modificri, precum fiierul original. Atunci cnd nu se specific numele unui fiier pentru a fi compresat, gzip citete de la intrarea standard, compreseaz i afieaz la ieirea standard.

83

UNIX

Pentru decompresie, se pot folosi comenzile gzip -d, gunzip sau gzcat. Atunci cnd decompresia se face (cu gzip -d sau gunzip) pe un alt sistem de fiiere dect cel iniial, exist posibilitatea ca numele original al fiierului s fie un nume invalid pentru noul sistem de fiiere. n acest caz, utilitarul de decompresie creeaz un fiier cu un nume valid pentru noul sistem de fiiere. Comanda gunzip Programul gunzip citete fiecare fiier ce ncepe cu numele specificat i are o extensie de tipul .gz, .z, .Z, .bz2, apoi terge fiierul i l nlocuiete cu varianta decomprimat a fiierului, nlturndu-i extensia. Sintaxa general pentru gunzip este:
$ gunzip [-acfhlLnNqrtvV] [-S sufix] [nume_fisier ...]

De asemenea, comanda gunzip recunoate i extensiile .tgz i .taz ca prescurtri ale extensiilor .tar.gz i .tar.Z. Aceste dou extensii sunt folosite de gzip atunci cnd fiierele comprimate au extensia .tar. n plus, gunzip poate decomprima fiiere comprimate cu alte comenzi, precum: zip, compress, compress -H, pack sau mkszip, recunoscnd automat tehnica de compresie folosit. Exist ns o serie de limitri la decompresie; de exemplu, fiierele comprimate cu zip pot fi decomprimate doar dac ele conin un singur fiier care a fost comprimat cu metoda deflation. n caz contrar, trebuie folosit utilitarul unzip pentru decompresie. Comanda gzcat Programul gzcat are un comportament asemntor comenzii gunzip -c. Acest program poate decompresa fiierele specificate la linia de comand, fie, dac nu sunt specificate fiiere (sau n loc de numele fiierelor apare liniua -), intrarea este standard input. Sintaxa general pentru gzcat este:

$ gzcat -fhLV [nume_fisier...]

Algoritmul (Lempel-Ziv) de compresie utilizat de gzip este identic cu cel folosit de utilitarele zip i pkzip. Procentul de compresie depinde de tipul fiierului comprimat, dar de regul este superior celui obinut de comanda compress ce folosete metoda LZW sau de comanda pack ce folosete

84

Administrarea fiierelor i directoarelor

metoda de compresie Huffman. Din punct de vedere al vitezei de execuie, gzip --fast este similar cu comanda compress. gzip modific (l comprim) fiierul specificat, chiar dac rezultatul are o dimensiune mai mare dect fiierul iniial. Semnificaia opiunile comenzilor gzip, gunzip i gzcat sunt prezentate n tabelul 3.26. Opiuni pentru comanda gzip
Opiunea -a (--ascii) Tabelul 3.26 Semnificaie Folosete modul text ASCII Caracterele sfrit de linie (end-ofline) sunt convertite folosind convenii locale. Pe sistemele Windows, gzip convertete CR+LF n LF atunci cnd comprim fiierul. La decompresie, gzip -d i gunzip convertete LF napoi n CR+LF. Scrie rezultatul produs ctre standard output i las fiierul de intrare nemodificat. Decomprim fiierul specificat Determin forarea compresiei/decompresiei chiar dac fiierul are mai multe legturi, dac fiierul output exist deja sau dac datele comprimate sunt citite sau scrise la un terminal. Afieaz informaii de ajutor Afieaz informaii despre fiecare fiier comprimat. Afieaz informaii despre licena gzip Nu salveaz implicit folosind numele fiierului iniial Atunci cnd fiierele sunt compresate, se salveaz totdeauna numele i informaiile fiierului iniial, astfel nct la decompresie, numele fiierului iniial este restaurat. Aceast opiune se folosete pe sisteme ce au reguli stricte privind lungimea fiierului. Suprim toate mesajele de avertisment Acioneaz pe structura directorului recursiv (inclusiv subdirectoarele) Modific extensia implicit .gz n extensia specificat n sufix. Face un test de integritate a fiierului comprimat Afieaz informaii adiionale pentru fiecare fiier n parte, cum ar fi numele i procentul de reducere a dimensiunii

-c (--stdout) -d (--decompress) -f (--force)

-h (--help) -l (--list) -L -n (--no-name) -N (--name)

-q (--quiet) -r (--recursive) -s sufix -t (--test) -v (--verbose)

85

UNIX

Exemple Putem determina dimensiunea fiierului necomprimat cu o comand de genul:


$ gzcat fisier.Z | wc -c

Atunci cnd utilizm opiunea -l n conjuncie cu opiunea -v, se afieaz informaii complete, de genul:
method: -metoda de compresie folosit crc: -crc-ul pe 32 de bii pentru datele necompresate date/time -data i ora fiierului necompresat

Cu ajutorul comenzii gzcat putem citi un fiier compresat cu gzip fr a realiza efectiv decompresia, ca n exemplul urmtor:
$ gzcat carte cap1 cap2 cap3

Compresia mai multor fiiere Putem concatena mai multe fiiere comprimate. n acest caz, gunzip va extrage toate fiierele din fiierul rezultat prin concatenare. De exemplu:
$ gzip -c fisier1 > fiscat.gz $ gzip -c fisier2 >> fiscat.gz

Dup crearea fiierului comprimat fiscat.gz, comanda:


$ gunzip -c fiscat.gz

86

Administrarea fiierelor i directoarelor

este echivalent cu:


$ cat fisier1 fisier2

Dac unul dintre fiierele cu extensia .gz sunt stricate, celelalte fiiere pot fi recuperate (fiierul stricat este nlturat). Putem mbunti nivelul de compresie prin comprimarea tuturor fiierelor mpreun, n loc de a le comprima individual i apoi concatena rezultatele. De exemplu:
$ cat fisier1 fisier2 | gzip > fiscat.gz

ne va oferi o mai bun compresie dect n cazul:


$ gzip -c fisier1 fisier2 > fiscat.gz

87

1. Servicii de reea

SERVICII DE REEA

Dou dintre cele mai utilizate servicii de reea n UNIX sunt NFS i ARPA. Serviciile NFS (Network File System) reprezint servicii de reea ce permit partajarea de directoare n reea. ARPA este rezultatul unei combinaii ntre servicii ARPA i servicii Berkeley. Serviciile ARPA ofer suport pentru comunicaiile dintre sisteme ce ruleaz sisteme de operare diferite, n timp ce serviciile Berkeley ofer suport doar pentru sisteme ce ruleaz sub UNIX. n continuare sunt prezentate cele mai cunoscute comenzi ARPA-Berkeley. 4.1 Servicii ARPA

4.1.1 Serviciul telnet telnet reprezint una dintre cele mai folosite metode de conectare la un sistem aflat la distan. Comanda telnet utilizeaz pentru comunicaie protocolul cu acelai nume i este o alternativ pentru o alt comand similar, rlogin. Exemplul urmtor prezint modalitatea de stabilire a unei conexiuni telnet cu un computer la distan (numele computerului este infocib):
Comentarii $ telnet infocib Connected to infocib. AIX version 5 infocib login: stud password: Welcome to infocib rs6000 aix 5L $ Comanda de iniializare a unei comunicaii telnet cu serverul infocib Mesajul primit ca urmare a stabilirii conexiunii pe serverul infocib Login cu nume de utilizator stud Se introduce parola Mesajul de ntmpinare de pe server Prompter-ul AIX de pe infocib

88

UNIX

4.1.2 Serviciul ftp ftp protocolul de transfer de fiiere FTP (File Transfer Protocol), reprezint cea mai folosit metod pentru transferul de fiiere de pe un computer pe altul. Se poate utiliza pentru transferul de fiiere ntre orice tip de staii de lucru sau servere (Windows, UNIX, etc.). n exemplul urmtor se va copia fiierul test.file de pe serverul infocib pe staia local. Fiierul test.file se afl n subdirectorul tmp al directorului home pentru utilizatorul stud.
Comentarii $ ftp infocib Connected to infocib. Infocib FTP server (version 5) ready Introducerea comenzii ftp Mesajul de stabilire a conexiunii cu serverul Se cere introducere numelui de login se introduce numele de utilizator stud Se afieaz un mesaj prin care se specific faptul c utilizatorul stud trebuie s se autentifice prin introducerea parolei Se introduce parola Mesajul de ntmpinare de pe server Intrm n subdirectorul tmp Lansm comanda get pentru a copia fiierul test.file Transferul fiierului a fost fcut cu succes. nchiderea conexiunii ftp. Apariia prompter-ului de pe server.

Name: stud

Password required for stud.

Password: User stud logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp>cd tmp CWD command successful ftp>get test.file PORT command successful Opening BINARY mode data connection for test.file Transfer complete. 3305 bytes received n 0.03 seconds ftp> bye Goodbye. $

89

Sertvicii de reea

Prezentm n continuare o list cu cele mai utilizate comenzi ftp:


Comanda ascii Explicaii Seteaz tipul de transfer al fiierelor la ASCII (se vor transfera fiiere ASCII de pe un sistem pe cellalt). Aceasta este setarea implicit. Seteaz tipul de transfer al fiierelor la binar (se vor transfera fiiere binare de pe un sistem pe cellalt). Pentru copierea fiierelor de pe sisteme UNIX pe sisteme non-UNIX este bine s se utilizeze acest mod de transfer. Modific directorul curent de lucru pe calculatorul de la distan.

binary

cd

dir

Listeaz pe ecran coninutul directorului curent de pe calculatorul de la distan. Listarea se poate face ntr-un fiier dac se specific un nume de fiier. Comanda este utilizat pentru a copia un fiier de pe calculatorul de la distan pe calculatorul local. Modific directorul curent pe calculatorul local. Listeaz pe ecran coninutul directorului curent de pe calculatorul de la distan. Comanda este utilizat pentru copierea mai multor fiiere de pe calculatorul de la distan. Cu ajutorul comenzii put se copiaz fiierul specificat de pe calculatorul local pe calculatorul de la distan. Cu aceast comand se copiaz mai multe fiiere de pe calculatorul local pe calculatorul de la distan. Se nchide conexiunea ftp cu calculatorul de la distan.

get

lcd ls

mget

put

mput

quit/bye

90

UNIX

4.1.3 Servicii Berkeley Comanda rlogin Comanda rlogin (remote login) ofer posibilitatea conectrii la un sistem UNIX de la distan. Pentru a ne conecta de pe computerul local pe computerul infocib, vom utiliza comanda:
$ rlogin infocib

n continuare, dac se cere o parol, cei doi utilizatori (cel de pe sistemul local i cel de pe sistemul de la distan) nu sunt echivaleni pe cele dou sisteme. Dac nu se cere nici o parol, atunci ei sunt echivaleni. Comanda rlogin se poate utiliza i astfel:
$ rlogin nume_sistem -l nume_utilizator

n care se poate specifica numele de utilizator (nume_utilizator) de pe sistemul de la distan (al crui nume este nume_sistem) la care se face conectarea. Comanda rcp Comanda rcp (remote copy) este utilizat pentru a se copia fiiere i directoare de pe un sistem UNIX pe alt sistem UNIX. Pentru a copia fiierul /tmp/test.file de pe computerul local pe computerul infocib, vom utiliza comanda:
$ rcp infocib:/tmp/test.file /tmp/test.file

Comanda remsh Comanda remsh (remote shell) este utilizat atunci cnd suntem conectai la un sistem UNIX i dorim s rulm o comand pe alt sistem UNIX. Rezultatele comenzii sunt afiate local. n exemplul de mai jos putem vizualiza coninutul fiierului test.file aflat pe serverul infocib folosind comanda more:
$ remsh infocib more /tmp/test.file

n acest caz trebuie ca utilizatorii de pe cele dou sisteme s fie echivaleni (s aib acelai nume i aceeai parol).

91

Sertvicii de reea

Comanda rwho Comanda rwho (remote who) este utilizat pentru a determina utilizatorii conectai la alt sistem UNIX. Pentru ca aceast comand s funcioneze este necesar rularea daemonului rwhod. Exist i alte comenzi de tip r (remote) care difer ntre ele n funcie de varianta de UNIX utilizat. 4.1.4 Maparea numelor staiilor din reea Un lucru important de configurat n reea l reprezint modalitatea de recunoatere i mapare a numelor staiilor din reea. n acest sens exist trei metode: BIND (Berkeley Internet Named Domain) NIS (Network Information Service) Fiierul /etc/hosts Modalitatea cea mai simpl i cea mai uzitat este aceea de implementare a numelor staiilor folosind fiierul /etc/hosts. Acest lucru se ntmpl mai ales pentru reele locale restrnse, ce au un numr mic de staii de lucru. n reele mari este utilizat sistemul DNS (Domain Name Server) care rezolv maparea numelor staiilor de lucru, utiliznd BIND pentru a determina adresa pornind de la nume. Sistemul BIND funcioneaz pe baza modelului client/server, astfel nct n momentul n care un client dorete adresa unei staii aceasta este oferit de ctre serverul BIND. Utilizarea sistemului BIND conduce la performane mai bune pentru meninerea informaiilor legate de nume deoarece datele sunt stocate doar n cteva locuri i nu pe fiecare sistem n parte (ca n cazul fiierului /etc/hosts). Staiile client folosesc un fiier /etc/resolv.conf pentru configurarea programului resolver (care determin adresa folosind numele). Serverul de nume i adresa IP a sa reprezint elementele cheie n rezolvarea maprii adreselor. Configurarea sistemelor DNS i BIND este sarcina administratorului de reea. Fiierul /etc/hosts Acest fiier conine informaii despre alte sisteme cu care suntem conectai n reea. Informaiile din fiier reprezint adresa Internet a fiecrui sistem, numele sistemului i alte alias-uri pentru acesta. Dac fiierul /etc/hosts este modificat pentru a conine numele sistemelor din reea atunci se poate folosi comanda rlogin pentru a accesa alt sistem. O linie din fiierul /etc/hosts arat n felul urmtor:
<adresa_ip> <nume_oficial> <alias>

92

UNIX

Fiierul /etc/hosts.equiv Acest fiier este utilizat n cazul n care se dorete utilizarea comenzii rlogin fr ca utilizatorii s fie nevoii s introduc o parol atunci cnd se conecteaz la un alt sistem. Totui, acest lucru presupune un mare risc de securitate i din aceast cauz acest procedeu nu este prea des utilizat. Numele de login ale utilizatorilor trebuie s fie aceleai pe ambele sisteme pentru ca fiierul /etc/hosts.equiv s permit utilizatorilor s se conecteze fr a introduce o parol. Fiierul /etc/hosts.equiv trebuie s conin numele staiilor din reea de pe care se dorete conectarea, separat fiecare nume pe cte o linie din fiier. Fiierul /.rhosts Fiierul /.rhosts reprezint alternativa fiierului /etc/hosts.equiv pentru superuser. Dac se face conectarea ca root, putem avea aceleai date stocate n /.rhosts ca cele din /etc/hosts.equiv. Acest lucru presupune ns o mare bre de securitate n sistem i nu este recomandat a fi utilizat. Utilizarea fiierelor /etc/hosts, /etc/hosts.equiv i /.rhosts conduce la posibilitatea utilizrii comenzilor ARPA ftp i telnet, precum i a comenzilor Berkeley rcp, remsh, rlogin i rwho. 4.1.5 Alte comenzi pentru lucrul n reea Comanda ping Una dintre cele mai folosite comenzi de reea este comanda ping. Aceasta determin existena unei conexiuni ntre dou entiti din reea. Comanda ping (Packet InterNet Groper) trimite un pachet ecou ICMP ctre staia specificat o dat la fiecare secund. n funcie de varianta de UNIX utilizat, comanda ping poate diferi de la un sistem la altul, mai ales n ceea ce privete modalitatea afirii rezultatelor pe ecran atunci cnd comanda este apelat fr nici o opiune. n timp ce unele variante afieaz rezultate detaliate despre conexiune, unele variante afieaz doar un mesaj de tipul: conexiunea este activ. Pe un sistem UNIX AIX putem specifica intervalul la care se trimit pachetele, precum i dimensiunea i numrul de iteraii. Putem considera

93

Sertvicii de reea

spre exemplu urmtoarea comand, n care pachetele se trimit la un interval de 3 secunde cu dimensiunea pachetului de 4096 octei de 8 ori:
$ ping I 3 venus 4096 8 PING venus: 4096 data bytes 4096 bytes from venus (193.226.34.143): icmp_seq=0. 4096 bytes from venus (193.226.34.143): icmp_seq=1. 4096 bytes from venus (193.226.34.143): icmp_seq=2. 4096 bytes from venus (193.226.34.143): icmp_seq=3. 4096 bytes from venus (193.226.34.143): icmp_seq=4. 4096 bytes from venus (193.226.34.143): icmp_seq=5. 4096 bytes from venus (193.226.34.143): icmp_seq=6. 4096 bytes from venus (193.226.34.143): icmp_seq=7. ----venus PING statistics---8 packets transmited, 8 packets received, 0% packet round-trip (ms) min/avg/max = 9/9/15

time=8. time=9. time=8. time=9. time=9. time=8. time=8. time=8. loss

ms ms ms ms ms ms ms ms

Comanda ping este utilizat pentru depistarea manual a eventualelor disfunciuni n reea i nu se recomand a fi folosit n mod continuu deoarece genereaz mult trafic n reea. Comanda netstat Aceast comand este utilizat pentru a determina diverse informaii legate de rutarea din reea. Opiunea r ne va afia tabela de rutare iar opiunea n poate fi folosit pentru a afia adresele IP din reea. Alt opiune este -v pentru afiarea de informaii adiionale legate de rutare, cum ar fi masca de subreea. n exemplul urmtor comanda netstat este apelat cu opiunea nr:
# netstat nr Routing tables Dest/Netmask 127.0.0.1 4136 10.1.1.10 lan0 10.1.1.110 lan1 10.1.1.0 lan0 10.1.1.0 lan1 127.0.0.0 lop0 default 1300 #

Gateway Flags Refs 127.0.0.1 10.1.1.10 4136 10.1.1.110 4136 10.1.1.110 1300 10.1.1.10 1300 127.0.0.1 4136 10.1.1.1 UG

Use UH UH UH U U U 0

Interface Pmtu 0 133563 lop0 0 0 2 2 0 0 356 0 2 0 0 lan1

94

UNIX

Dar s vedem ce semnificaie au informaiile afiate mai sus. Sistemul pe care lucrm se numete a1 i posed trei interfee. Prima interfa este interfaa loopback (127.0.0.1) denumit lop0, cea de-a doua este .10 iar cea de-a treia .110. Urmtoarele dou linii specific faptul c destinaia noastr este 10.1.1.10 care este o reea ce poate fi accesat prin intermediul uneia dintre interfeele de reea .10 sau .110. Ultima linie specific faptul c trebuie trimise pachete la adresa 10.1.1.1 dac nu se poate gsi o rut mai direct. Un interes deosebit l au indicatorii flags prin care se definete tipul de rutare, astfel: 1=U rutare ctre o reea printr-un gateway care este chiar sistemul local; 3=UG rutare ctre o reea printr-un gateway care este sistem la distan; 5=UH rutare ctre o gazd printr-un gateway care este sistemul local; 7=UGH rutare ctre o gazd printr-un gateway la distan care este o gazd. Comanda route Informaia afiat de comanda netstat provine din tabelele de rutare ale sistemului care sunt automat create n momentul iniializrii sau n momentul activrii interfeei de reea. Rutele ctre reele sau gazde ce nu sunt direct conectate la sistem sunt introduse cu ajutorul comenzii route. n exemplul urmtor se modific indicatorul Flags din U n UG:
$ /usr/bin/route add default 193.226.34.64 3

Comanda route de mai sus specific faptul c dorim s adugm o rut (add), adugm o destinaie (cea implicit - default), un gateway prin care s fac rutarea. n exemplu s-a considerat adresa IP, dar se poate specifica i un nume de reea. Valoarea 3 corespunde cu valoarea pe care dorim s o atribuim indicatorului Flags (specificm dac gateway-ul este local sau nu).

95

Sertvicii de reea

Comanda ifconfig Aceast comand ne ofer informaii suplimentare legate de interfaa de reea. Exemplul urmtor ne nfieaz listingul comenzii:

$ /etc/ifconfig eth0
eth0:flags=863<UP,BROADCAST,NOTRAILERS,RUNNING> inet 193.226.34.141 netmask ffffff00 broadcast 193.226.34.255

Din informaiile anterioare putem vedea c interfaa funcioneaz (este UP), are adresa IP 193.226.34.141 i un netmask ffffff00. De asemenea, comanda ifconfig se poate utiliza pentru configurarea manual a interfeei, specificndu-se adresa IP i masca de subreea. Spre exemplu, comanda:

$ /etc/ifconfig eth0 inet 193.226.34.141\ netmask 255.255.255.0

configureaz interfaa de reea astfel: netmask cu valoarea 255.255.255.0 corespunde notaiei hexa specificate anterior (fffff00), fiind vorba despre o adres IP de clas C; eth0 este denumirea interfeei ce este configurat; inet reprezint familia adresei; 193.226.34.141 este adresa IP a interfeei. Observaie Caracterul backslash (\) utilizat mai sus specific continuarea comenzii pe linia urmtoare. Comanda rpcinfo Pentru determinarea funcionalitii unui sistem putem observa procesele de tip daemon ce ruleaz pe acesta. Comanda rpcinfo este utilizat pentru a genera un apel de procedur la distan (RPC Remote Procedure

96

UNIX

Call) pe un sistem oarecare sau chiar pe sistemul local. Sintaxa comenzii rpcinfo este:
# rpcinfo -p nume_sistem

Considerm urmtorul listing al comenzii rpcinfo p:


# rpcinfo p
program 100000 100000 100024 100024 100021 100005 100005 vers 2 2 1 1 1 1 1 proto tcp udp udp tcp udp udp tcp port 111 111 777 779 1024 976 978 service portmapper portmapper status status nlockmgr mountd mountd

Observm n lista de mai sus c ruleaz o serie de procese daemon pe sistemul curent; spre exemplu, rularea daemon-ului mountd indic faptul c un server NFS poate monta sisteme de fiiere pe acest computer. Comanda arp Cu ajutorul acestei comenzi se poate vizualiza coninutul memoriei cache ARP. Corespondenele ntre adresele IP i adresele nivelului 2 MAC sunt memorate ntr-o zon de memorie special denumit memorie ARP cache. Maparea adreselor se face la interval de cteva minute; de aceea, pentru a vizualiza adresele recent mapate existente n memoria ARP cache putem folosi comanda arp a:
# arp a a1 (10.1.1.10) at 0:10:86:ff:a2:f3 ether l1 (10.1.1.11) at 0:10:86:ff:a3:b5 ether tape1 (10.1.1.12) at 0:10:86:ff:65:a3 ether

Se pot introduce manual corespondene n memoria cache ARP utiliznd opiunea s.

97

Sertvicii de reea

Comanda nslookup Aceast comand este utilizat pentru determinarea adresei IP a unei gazde creia i cunoatem numele. Pentru determinarea adresei IP, nslookup acceseaz fie fiierul resolv.conf fie /etc/hosts. Exemplul urmtor ne prezint utilizarea fiierului /etc/hosts pentru a determina adresa IP a sistemului venus:
# nslookup venus Using /etc/hosts on: venus Looking up FILES Name: venus Address:193.226.34.141 #

4.2

Integrarea cu alte sisteme de operare

De-a lungul anilor au fost dezvoltate o serie de instrumente software pentru a permite mai multor sisteme de operare s se integreze n aceeai reea. Flexibilitatea i puterea sistemului de operare UNIX ofer avantajul integrrii a diferite variante ale acestui sistem de operare fa de integrarea cu sisteme non-UNIX. Cu toate acestea, diverse variante UNIX trateaz n mod diferit operaiuni identice. Exist, spre exemplu, diferene n controlul tipririi ntre System V i BSD, diferene care complic un pic lucrurile atunci cnd vrem s partajm imprimante ntr-o reea cu staii de lucru sau servere Solaris, BSD sau Linux. Datorit realitilor practice care ne impun ca de multe ori s integrm sisteme UNIX cu sisteme ce ruleaz ceva cu totul diferit (Windows, NetWare sau MacOS) s-a impus apariia unor instrumente care s transforme reelele eterogene n ceva mai practic i mai uor de construit i controlat. Astfel, cu ajutorul programului Samba putem integra sisteme Windows ntr-o reea UNIX (sau sisteme UNIX ntr-o reea Windows NT), putem partaja fiiere i job-uri de tiprire i putem gestiona staiile de lucru din reea fie de pe staiile Windows, fie de pe cele UNIX. De asemenea, putem folosi netatalk (pentru protocolul de reea AppleTalk) pentru a putea face s comunice staiile UNIX cu cele Macintosh. Vom aborda n continuare dou mari programe cu ajutorul crora putem lucra ntr-o reea eterogen, bazat pe staii de lucru UNIX i nu

98

UNIX

numai. La nceput vom prezenta NFS (Network File System) ce acioneaz ca o punte de legtur ntre diverse variante de UNIX, permind montarea i partajarea sistemelor de fiiere la distan. Vom prezenta n continuare Samba pentru a vedea cum pot interaciona n aceeai reea att clieni UNIX ct i clieni Windows. 4.2.1 Integrarea diverselor variante UNIX cu ajutorul NFS Deoarece totul n UNIX este reprezentat sub form de fiier, nseamn c pentru a putea face s comunice dou calculatoare pe care ruleaz UNIX n aceeai reea, acestea trebuie s fie capabile s partajeze fiiere. Partajarea fiierelor este o modalitate util de a distribui informaii unui numr de utilizatori, indiferent de modul de conectare al acestora la reea. n cazul n care exist staii de lucru sau servere specializate n ndeplinirea anumitor funcionaliti (un server de baze de date, spre exemplu), este deosebit de util ca alte staii de lucru s poat accesa fiiere n reea de pe aceste maini fr a fi nevoite s copieze fiierele direct pe propriul hard disc. Partajarea fiierelor ntr-o reea UNIX se poate face prin montarea directoarelor n reea astfel nct ele apar ca directoare locale pe staia de lucru. Dac utilizm staia de lucru X, se poate monta un director de pe staia de lucru Y ca i cum acesta ar fi local pe staia X. n momentul n care nu mai avem nevoie de acel director, el va fi demontat. Aceste lucruri sunt posibile cu ajutorul sistemului NFS. NFS reprezint metoda de partajare a fiierelor ntre mai multe calculatoare UNIX; el reprezint un standard, ns are cteva probleme legate de securitate. Instalarea i configurarea NFS Sistemul NFS face parte integrant din majoritatea distribuiilor de UNIX. De cele mai multe ori el este instalat odat cu instalarea sistemului de operare. Putem verifica acest lucru uitndu-ne n directorul /etc/init.d pentru un script numit nfs-server; prezena acestui script ne spune c serverul NFS este activ i c este instalat pe sistem.

Odat cu instalarea NFS este util i instalarea NIS. Network Information System acioneaz ca o baz de date centralizat ce conine date administrative importante cum ar fi parolele i fiierul /etc/hosts.

99

Sertvicii de reea

Pentru a putea accesa un sistem de fiiere localizat pe alt staie de lucru, trebuie ca pe server s ruleze daemon-ul nfsd iar pe staia client s ruleze daemon-ul mountd. n continuare vom considera un exemplu concret. S presupunem c maina pe care dorim s avem directorul se numete saturn. Aceast main este conectat n reea la un server ce se numete venus. Dorim s exportm directorul /usr/home de pe calculatorul venus pe saturn pentru a putea folosi nite fiiere din acest director. Pentru acest lucru, trebuie mai nti s acordm dreptul pe venus ca acest director s poat fi montat pe saturn. Pentru a putea exporta directorul /usr/home sub Linux i FreeBSD trebuie s fim logai ca root, s deschidem fiierul /etc/exports cu un editor de text i s adugm urmtoarea linie:
/usr/home saturn

Aceast intrare n fiier conine deci directorul exportat i numele calculatorului ce are permisiunea s l acceseze. Salvm fiierul i utilizm comanda exportfs la prompter-ul shell. Aceast comand face ca toate directoarele coninute de /etc/exports s fie disponibile pentru a fi accesate imediat de ctre calculatoarele specificate. Pe maina client, saturn, ne vom conecta tot ca root i va trebui s montm directorul pe care dorim s l accesm de pe calculatorul venus. n acest sens vom crea pe saturn un director gol denumit venushome i apoi vom lansa comanda
# mount -t nfs venus:/usr/home /venushome

n acest moment, clientul NFS verific pe serverul NFS instalat pe venus dac directorul specificat este accesibil pentru saturn. Deoarece acest director este specificat n /etc/exports, clientul NFS va monta directorul de la distan n noul punct de montare i se pot folosi fiierele respective.

Pe un sistem Solaris se utilizeaz fiierul /etc/dfs/dfstab n locul fiierului /etc/exports, iar intrrile din fiier au forma: share o rw=saturn d venus usr home /mn/venus/usr/home

100

UNIX

Montarea automat utiliznd fiierul /etc/fstab Pentru a simplifica montarea repetat a unor directoare la distan se poate folosi fiierul /etc/fstab pentru a monta directoare la distan automat n momentul iniializrii sistemului. Fiierul /etc/fstab conine o list cu toate directoarele ce vor fi montate n momentul iniializrii sistemului, fie ele locale, fie la distan. Un fiier /etc/fstab obinuit arat astfel:
LABEL=/ /dev/cdrom /dev/fd0 none none /dev/hda4 / /mnt/cdrom /mnt/floppy /proc /dev/pts swap ext2 defaults iso9660 noauto,owner,ro auto noauto,owner proc defaults devpts gid=5,mode=620 swap defaults 1 0 0 0 0 0 1 0 0 0 0 0

Utilizarea lui /etc/fstab ne ajut mult la montarea automat a sistemelor de fiiere i a directoarelor; ca root putem modifica acest fiier adugnd directoare pe care le dorim montate automat n momentul iniializrii sistemului. Sintaxa este urmtoarea:

nume_dispozitiv pass

punct_de_montare tip_director optiuni dum

O linie n fiierul /etc/fstab conine astfel: directorul dorit (nume_dispozitiv), calea unde va fi montat local (punct_de_montare), tipul de director (tip_director), opiuni (de exemplu, pentru a putea fi doar citit i nu modificat: read-only = ro), numere specifice pentru verificarea de ctre sistem (dump i pass).

101

Sertvicii de reea

Fiierul /etc/fstab urmtor conine nc dou linii n plus care determin montarea n momentul iniializrii sistemului a dou partiii Windows pe un sistem dual Linux Red Hat/Windows:

LABEL=/ /dev/cdrom /dev/fd0 none none /dev/hda4 /dev/hda1 /dev/hda5 0 0

/ /mnt/cdrom /mnt/floppy /proc /dev/pts swap /mnt/c /mnt/d

ext2 iso9660 auto proc devpts swap

defaults 1 noauto,owner,ro 0 noauto,owner 0 defaults 0 gid=5,mode=620 0 defaults 0 auto defaults auto defaults

1 0 0 0 0 0 0 0

Aceste partiii sunt asociate dispozitivelor /dev/hda1 i respectiv /dev/hda5 care vor fi montate n directoarele /mnt/c, respectiv /mnt/d. Securitatea NFS Se cunosc o serie de bree n securitatea sistemului NFS, de aceea e bine s inem seam de acestea atunci cnd l utilizm. Trebuie astfel s ne lum o serie de precauii atunci cnd configurm serverul NFS i montm directoarele. Cel mai important lucru pe care trebuie s l facem este acela de a evita instalarea serverului NFS pe o main ce are rol de gateway sau de firewall. Deoarece unul dintre punctele slabe ale NFS este autentificarea parolelor, este bine s izolm serverul NFS de eventuale computere ce pot avea acces la acesta din exteriorul reelei. De asemenea, ca n cazul oricrui program ce presupune accesul la distan, se impune instalarea tuturor patch-urilor de securitate existente n momentul respectiv pentru versiunea de UNIX respectiv. Alte msuri de securitate includ: Niciodat nu trebuie s apar o referin ctre un localhost n /etc/exports; Este bine s exportm fiierele ca read-only pentru a exclude posibilitatea ca cineva din exterior s le modifice; Editarea fiierului /etc/exports se va face exportnd directoare ctre nume de domenii existente i nu ctre nume generice de maini (de exemplu se prefer folosirea numelui saturn.ase.ro n locul lui saturn);

102

UNIX

Dup modificarea, salvarea i nchiderea fiierului /etc/exports trebuie rulat imediat programul exportfs. 4.2.2 Integrarea UNIX - WINDOWS Pentru a face posibil comunicarea dintre dou sau mai multe computere ce ruleaz UNIX i Windows exist o serie de produse software. Fr aceste programe comunicarea dintre un sistem UNIX i unul Windows nu ar fi posibil, datorit protocoalelor diferite de transfer al datelor folosite de ctre cele dou sisteme de operare. Protocolul utilizat de Windows se numete SMB (Session Message Block), care nu este nativ pentru UNIX. Dou dintre programele ce fac posibil comunicarea UNIX-Windows sunt NFS Maestro (Hummingbird Communications Ltd.) i Samba. Datorit popularitii acestuia din urm, vom analiza n continuare modul de lucru al programului Samba. Samba este o colecie de programe ce pemite unei maini UNIX s foloseasc protocolul SMB i s partajeze astfel fiiere ntre cele dou sisteme diferite. Samba poate s emuleze atribute ale serverelor Windows NT astfel nct clienii Windows pot lucra n mod eficient cu serverele. n funcie de varianta de UNIX utilizat, Samba se instaleaz ntr-un anumit director; exist, de asemenea, cteva distribuii de Linux care instaleaz Samba n mod automat la instalarea sistemului. Pentru a verifica dac Samba este instalat sau nu, este suficient s ne uitm n directorul /etc/init.d pentru subdirectorul /etc/init.d/samba. Dac acest director exist, atunci nseamn ca avem Samba instalat pe sistem i trebuie doar configurat. Instalarea i configurarea programului Samba Programul Samba este prezent de regul pe CD-urile de instalare ale sistemului de operare utilizat, dar se poate descrca i ultima versiune a produsului de la adresa http://www.samba.org, adresa de Web oficial a echipei ce se ocup cu dezvoltarea produsului. Versiunea curent este 3.0.6 (August 2004). Dup ce programul Samba este instalat, trebuie configurat; fiierul de configurare este /etc/samba/smb.conf.

Ghidul complet pentru Samba este Using Samba, de Robert Eckstein, David Collier Brown i Peter Kelly (OReilly&Associates, 1999).

103

Sertvicii de reea

Deschidem fiierul /etc/samba/smb.conf cu editorul de text preferat; este uor de lucrat cu el deoarece este modular iar seciunile (modulele) din fiier sunt clar specificate. Vom avea nevoie de o seciune [global] indiferent de mrimea reelei i de cte o nregistrare individual n fiier pentru fiecare director pe care dorim s l partajm cu calculatoare Windows n reea. nregistrarea global definete reeaua ca un ntreg pentru calculatoarele Windows din reea. Sintaxa este uor de neles, fiierul de configurare Samba utiliznd expresii n englez n locul acronimelor i abrevierilor. Un fiier minimal de configurare Samba poate arta astfel:

[global] workgroup = NETWORK server string = saturn encrypt passwords = Yes update encrypted = Yes log file = /var/log/samba/log max log size = 100 socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDUP=8192 dns proxy = No

Fiierul de configurare anterior va seta numele reelei ca NETWORK atunci cnd vom deschide directorul Network Neighbourhood de pe o staie Windows (putem folosi orice nume n acest scop). Valoarea server string este asociat cu numele ce va aprea n directorul ce se va deschide. Samba stocheaz datele de iniializare n fiierul /var/log/samba/log (implicit) i va conine maxim 100 de linii (cele mai recente). Opiunea socket definete modalitatea de control a datelor transferate n reea iar dns proxy specific dac serverul va aciona precum un proxy server DNS local sau nu. Odat specificate setrile globale, trebuie adugat o nregistrare pentru fiecare director pe care vrem s-l partajm cu staiile Windows n reea. Acest lucru este necesar deoarece nu dorim s partajm ntregul sistem de fiiere UNIX cu toate calculatoarele Windows din reea.

Fiierul /etc/samba/smb.conf conine comentarii specificate ntr-un mod diferit fa de alte fiiere asemntoare UNIX. Toate liniile ce ncep cu caracterul ; sunt considerate comentarii, spre deosebire de caracterul # utilizat n mod curent.

104

UNIX

Pentru a partaja un anumit director, putem aduga o nregistrare n fiierul /etc/init.d/samba/conf cu urmtoarea structur:
[public] comment = spatiu public path = /usr/public guest ok = yes writable = yes printable = no public = yes

Sintaxa de baz include numele directorului partajat i civa parametri prin care se specific modul n care acest director este disponibil utilizatorilor din reea. Numele cuprinse ntre paranteze drepte vor aprea n directorul Network Neighbourhood din Windows. Linia ce conine specificarea cii de acces definete calea din sistemul de fiiere UNIX n timp ce linia guest ok specific dac un utilizator are acces la director fr a introduce un username/parol. Liniile writable i printable seteaz modalitatea de acces a directorului iar valoarea public specific dac directorul va fi accesibil utilizatorilor. Utilizarea programului Samba Dup ce s-a terminat configurarea fiierului /etc/init.d/samba/conf putem porni Samba pentru a verifica legturile din reea. Repornirea serverului Samba se face cu comanda:
# /etc/init.d/samba restart

n acest moment serverul Samba este repornit cu configuraia din fiierul /etc/init.d/samba/conf i putem vedea staiile Windows din reea. Pe staiile Windows trebuie s deschidem Control Panel, selectm NetworkProperties. Verificm nscrierea corect a adreselor IP n cmpurile gateway i DNS; ele trebuie s corespund cu cele utilizate de serverul UNIX. Apsm butonul Apply pentru a salva modificrile, ieim din configuraia reelei i repornim sistemul. Reeaua definit trebuie s apar n Network Neighbourhood dup repornirea sistemului. Se poate specifica accesul la directoarele partajate pe sistemul UNIX astfel nct unele staii s poat accesa directoarele iar altele nu. Acest lucru se poate realiza prin includerea n fiierul de configurare a unei linii host allow ce are sintaxa:
# host allow statie

105

Sertvicii de reea

unde statie reprezint fie numele staiei de lucru, fie adresa IP a acesteia. Se pot specifica mai multe staii de lucru ale cror nume pot fi separate de spaiu sau virgul. De asemenea, se poate interzice accesul anumitor staii prin host deny:
# host deny statie

Pentru a obine informaii despre multiplele configurri posibile ale programului Samba, este bine s se consulte pagina de manual cu comanda:
$ man smb.conf

Partajarea directoarelor pentru acces personalizat n afar de faptul c se poate asigura accesul public la directoarele partajate, uneori este necesar ca aceste directoare s fie accesibile unui numr limitat de utilizatori. S considerm cazul n care dorim s partajm directorul /users/personal cu numele personal iar acesta s fie accesibil doar pentru utilizatorii stud1, stud2 i stud3. n acest sens, fiierul de configurare Samba trebuie s conin urmtoarele linii:
[personal] path = /users/personal valid users = stud1 stud2 stud3 writable = yes printable = no public = no create mask = 0765

Servicii de printare folosind Samba Unul dintre avantajele reale ale utilizrii Samba n reea este posibilitatea partajrii unei imprimante n reea, indiferent dac job-urile de tiprire provin de la o staie UNIX sau de la una Windows. n acest sens este mai bine s se conecteze imprimanta la serverul UNIX deoarece configurarea imprimantei pentru reea se face mai uor aici. Pentru a partaja o imprimant ataat unei maini UNIX cu staii Windows din reea, trebuie s editm din nou fiierul de configurare Samba. La sfritul nregistrrii

106

UNIX

[global] din fiierul /etc/init.d/samba/conf linii:

trebuie adugate urmtoarele

printing = bsd printcap name = /etc/printcap load printers = yes log file = /var/log/samba/log lock directory = /var/lock/samba

Aceste linii specific tipul de printare (BSD sau System V), locaia fiierului /etc/printcap utilizat de modul de tiprire Berkeley i locaiile fiierelor log i lock. Cea de-a treia linie specific dac imprimantele sunt ncrcate n reea de fiecare dat cnd este repornit serverul Samba. Dup ce am modificat seciunea [global], trebuie s crem o nou seciune denumit [printers], ce ajut la configurarea opiunilor generale de imprimare. Vom considera n continuare urmtorul exemplu:
[printers] comment = all printers security = server path = /var/spool/lpd/lp browseable = no printable = yes public = yes writable = no create mode = 0700

Aceste setri cuprind: locaia job-urilor de tiprire, permisiunea pentru print spool i imprimantele crora li se aplic aceste setri. Odat stabilite setrile generale ale imprimantelor din reea, se poate configura separat fiecare imprimant existent n reea pentru a avea setri individualizate. Aceste setri individualizate pentru fiecare imprimant n parte conin numele i calea imprimantei precum i informaii importante caracteristice fiecrui tip de imprimant n parte.

107

Sertvicii de reea

Un exemplu de setare individualizat este urmtorul:


[ijet] security = server path = /var/spool/lpd/lp printer name = inkjet public = yes writable = no printable = yes print command = lpr r h P %p %s

Aceast configurare individual este specific fiecrui tip de imprimant; pentru a vedea ce tip de comand trebuie folosit pentru o imprimant specific trebuie consultat pagina de manual pentru comanda lpd prin comanda man lpd. Dup ce am terminat de fcut aceast configurare, se salveaz fiierul, se iese din editarea sa i se repornete serverul Samba prin comanda:
# /etc/init.d/samba restart

n continuare, pe staia Windows deshidem directorul Printers (Start-Settings-Printers), localizm noua imprimant i facem dublu-click pe icon-ul acesteia. n ecranul de configurare aprut o selectm ca imprimant de reea i avem de ales dac dorim s fie setat ca imprimant impicit sau nu. Apsm butonul Ok pentru a salva modificrile fcute i n acest moment putem selecta imprimanta de reea din meniul Print al programelor Windows. 4.2.3 Integrarea Linux Novell Posibilitile inter-operabilitii Linux-Novell sunt mult mai restrnse dect acelea ale cooperrii UNIX/Linux-Windows. O soluie de integrare pentru aceste sisteme de operare o constituie programele ncpfs i mars_nwe. Pachetul de instalare pentru ncpfs este disponibil la adresa: ftp.gwdg.de/pub/linux/misc/ncpfs iar pachetul mars_nwe la adresa: http://www.compu-art.de/download/mars_nwe.html. Prezentarea acestor programe nu face obiectul crii de fa, ns cei interesai pot studia instruciunile pentru utilizarea programelor la adresa web http://www.linuxdoc.org/HOWTO/IPX-HOWTO.html.

108

5
5.1

Editoare de text

1. Editoare de text Introducere

n acest capitol sunt prezentate dou editoare de text ce pot fi utilizate pentru scrierea fiierelor de tip text, implicit pentru scrierea programelor de tip shell-script. Primul editor este editorul clasic al UNIXului, ce se numete vi (visual editor - pronunat ca n englezescul vee eye) iar cel de-al doilea editor de texte este pico. Cu ajutorul acestor editoare de text vom crea i/sau modifica fiiere de configurare, fiiere de tip shell-script sau modifica fiiere de configurare a sistemului legate de reea, securitate, administrare etc. Editorul vi face parte integrant din sistemul de operare UNIX nc de la nceputurile acestuia (anii 70) i este disponibil pentru toate variantele de UNIX. Editorul vi este flexibil i dispune de o serie de faciliti puternice. Editorul pico este editorul popularului utilitarul de e-mail pine (marc nregistrat a Universitii din Washington), fiind extrem de rspndit n mediul universitar. 5.2 Editorul vi

Editorul vi este folosit pentru a crea sau modifica fiiere text sau ASCII (American Standard Code for Information Interchange), fiind un editor bazat pe caracter, parte integrant a sistemului de operare UNIX. Editorul vi utilizeaz ca mediu de afiare ecranul monitorului fr a se putea utiliza mouse-ul pentru deplasarea cursorului pe ecran; toate deplasrile cursorului se fac cu ajutorul tastelor. Operaia de editare n cadrul editorului vi se face prin intermediul unei memorii tampon sau buffer, iar modificrile fcute asupra textului pot fi salvate sau nu. Editorul vi opereaz doar asupra fiierelor text simple, fr caracteristici speciale de formatare (cum ar fi cele create de un editor de genul Word for Windows). Cu toate c utilizarea vi-ului este destul de dificil, utilizatorii experimentai i administratorii de sisteme UNIX trebuie

109

UNIX

s cunoasc acest editor. De asemenea, este foarte util i pentru utilizatorii mai puin experimentai s cunoasc (mcar) funcionalitile de baz ale editorului vi, avnd n vedere c acesta este parte integrant a sistemului de operare UNIX i multe aplicaii folosesc acest utilitar n mod implicit. Pentru administratorii de sistem ns, cunoaterea editorului vi are o importan major, deoarece exist cazuri n care acest editor reprezint unica posibilitate de editare a fiierelor de configurare a sistemului. Editorul vi este utilizat i atunci cnd se lucreaz la distan pe alt sistem UNIX, avnd n vedere c vi este disponibil pe toate variantele de UNIX. 5.2.1 Modurile de lucru n vi Pentru editorul vi exist trei moduri de lucru: modul comand, modul introducere i modul ultima-linie (last line). Toate comenzile disponibile n vi pot fi clasificate n unul dintre aceste trei moduri de lucru. Caracteristicile de baz ale celor trei moduri de lucru sunt urmtoarele: Modul comand - este modul iniial de lucru folosit pentru crearea i editarea fiierelor, poziionarea cursorului i modificarea textului deja existent. Toate comenzile se introduc plecnd de la acest mod de lucru. Apsarea tastei <ESC> din unul din celelalte dou moduri de lucru determin trecerea n modul comand; Modul introducere (sau editare) - este utilizat pentru introducerea de text. Introducerea unei comenzi de genul i (pentru inserare), a (pentru adugare) sau o (pentru deschiderea unei linii noi) determin trecerea din modul comand n modul introducere. Apsarea tastei <ESC> determin ntoarcerea n modul comand. Comenzile de introducere sunt date fr a se apsa dup ele tasta <ENTER>; Modul ultima-linie - este folosit pentru salvarea documentului editat i pentru ieirea din vi. Apsarea tastei : determin trecerea n acest mod de lucru. Apsarea tastei <ENTER> sau a tastei <ESC> determin trecerea n modul comand. Modul comand este modul iniial de lucru al editorului vi. n momentul pornirii editorului vi, automat se intr n modul comand. n acest mod de lucru se pot introduce fie comenzi pentru poziionarea cursorului n cadrul fiierului, fie comenzi de editare pentru inserarea de noi caractere sau modificarea coninutului deja existent. Pentru a ajunge din modul introducere n modul ultima-linie sau invers, trebuie s trecem mai nti prin modul comand. Toate comenzile sunt iniiate din modul comand.

110

Editoare de text

Apsarea tastei <ESC> ne plaseaz mereu n modul comand, de aceea putem utiliza tasta <ESC> n cazul n care nu tim n ce mod de lucru ne aflm. Modul introducere (editare) reprezint modul n care trebuie s ne aflm pentru a introduce text. Pentru introducerea de text, trebuie s dm o comand (prin simpla apsare a unei taste) cum ar fi i (insert - inserare), o (open new line - linie nou) sau a (append - adugare). Introducerea unei dintre comenzile anterioare determin trecerea din modul comand n modul introducere. n acest mod putem introduce noi caractere n textul iniial, apoi putem apsa tasta <ESC> pentru a ne ntoarce n modul comand. Modul ultima-linie este modul n care putem ajunge prin apsarea tastei :, ceea ce determin poziionarea cursorului pe ultima linie a ecranului (de aici provine i denumirea acestui mod de lucru). Modificrile fcute asupra fiierului sunt meninute ntr-o memorie tampon pn n momentul n care acestea sunt salvate pe disc. Utiliznd modul ultima-linie, putem salva periodic modificrile fcute asupra fiierului fie rmnnd n vi, fie salvnd i prsind editorul. De asemenea, se poate iei din editor fr a salva modificrile fcute. Modul ultima-linie este folosit i pentru a cuta iruri de caractere sau pentru a seta anumite preferine de editare. 5.2.2 Deschiderea fiierelor i comenzi de editare Editorul vi reprezint o aplicaie ce se pornete de la linia de comand UNIX. Ori de cte ori pornim editorul vi, deschidem un fiier. Putem specifica de la nceput fiierul ce se va deschide, fie putem deschide un fiier nou pe care l vom salva ulterior pe disc. Sintaxa general a comenzii vi este urmtoarea:
$ vi [optiuni] [nume_fisier]

unde att opiunile, ct i numele fiierului pot aprea sau nu. Paii de baz n utilizarea editorului vi sunt: deschiderea unui nou fiier sau a unuia deja existent; introducerea de text nou, modificarea textului deja existent sau adugarea de text; salvarea fiierului pe disc; ieirea din vi.

111

UNIX

Editorul vi poate fi apelat fie prin comanda vi nume_fisier, fie prin vedit, care pornete editorul vi cu modul show activat, n care n colul din dreapta jos al ecranului se afieaz modul de introducere curent (inserare, adugare sau line nou). n modul comand nu se va fia nimic. Modul show poate fi activat prin introducerea comenzii set showmode n dreptul caracterului : din modul ultima-linie. Comenzi de introducere O dat cu pornirea editorului vi i specificarea unui nume de fiier (sau nu) se poate introduce text n acel fiier. Pentru a introduce text, trebuie utilizate o serie de comenzi de introducere, comenzi ce sunt apelate din modul comand. n modul inserare sau introducere, pentru a folosi alte comenzi de inserare trebuie s ne ntoarcem n modul comand prin apsarea tastei <ESC>. Comenzile de inserare de baz sunt: a (adugare de text dup cursor), A (adugare de text la sfritul liniei), i (inserare de text naintea cursorului) i o (introducerea unei noi linii sub linia pe care se afl cursorul). Comenzi de baz pentru poziionarea cursorului n vi
Tabelul 5.1
Comanda j (sgeat n jos) k (sgeat n sus) h (sgeat stnga) l (sgeat dreapta) Tasta <SPACE> w b $ 0 sau ^ Tasta <RETURN> Semnificaie Deplasare o linie n jos Deplasare o linie n sus Deplasare cu un caracter la stnga Deplasare cu un caracter la dreapta Deplasare la dreapta cu un caracter Deplasare la dreapta cu un cuvnt Deplasare la stnga cu un cuvnt Deplasare la sfritul liniei Deplasare la nceputul liniei Deplasare la nceputul liniei urmtoare

112

Editoare de text

Salvarea fiierului i ieirea din vi Pentru a salva fiierul i a iei din editorul vi, trebuie mai nti s ne poziionm n modul de lucru ultima-linie prin apsarea tastei :. Pentru a salva fiierul este de ajuns s tastm :w. Dac dorim s salvm fiierul cu alt nume, vom introduce comanda :w nume_nou_fisier. Pentru a salva fiierul i a iei din vi, se poate tasta fie :wq, fie ZZ (direct din modul comand). Dac dorim s ieim din fiier fr s salvm modificrile fcute, putem introduce comanda :q!. n cazul n care se deschide un fiier read-only (poate fi doar citit, nu i modificat) care se dorete a fi modificat, se pot salva modificrile fcute prin introducerea comenzii :wq! (write-quit). Dac se dorete renunarea la toate modificrile fcute de la ultima salvare, se poate folosi comanda :e! (erase) care terge modificrile din buffer i ncepe editarea din nou. Observaie. n notaiile de mai sus apariia caracterului special : semnific faptul c suntem poziionai n modul de lucru ultima-linie. Comenzi de baz pentru tergerea textului n vi
Tabelul 5.2
Comanda x dw 5dw dd 2dd 3x Semnificaie Se terge caracterul din dreptul cursorului Se terge cuvntul (sau partea din cuvnt) situat la dreapta cursorului Se terg 5 cuvinte la dreapta Se terge ntraga linie pe care este poziionat cursorul Se terg 2 linii ncepnd cu linia curent Se terg 3 caractere ncepnd cu cel din dreptul cursorului

Comenzi de poziionare a cursorului n vi Comenzile de poziionare a cursorului sunt utilizate n modul comand n momentul n care se dorete deplasarea cursorului n cadrul textului de editat. Pentru poziionarea cursorului se pot folosi tastele cu sgei direcionale (stnga-dreapta, sus-jos) dar se pot folosi i combinaii mai rapide de taste. n tabelul 5.1 sunt prezentate o serie de combinaii de taste pentru poziionarea cursorului pe ecran.

113

UNIX

tergerea textului n vi tergerea caracterelor deja introduse se face din modul comand. n prealabil se face poziionarea pe caracterele ce se doresc a fi terse, apoi se utilizeaz comenzile de tergere din tabelul 5.2. Comenzile fac distincie ntre litere mari i litere mici i se introduc fr a mai apsa tasta <ENTER>. Modificarea textului, anularea comenzii anterioare, copiere i alipire de text n vi n tabelul 5.3 sunt prezentate comenzile de baz pentru modificare, anularea comenzii anterioare (undo), copiere i alipire de text. Operaia de copiere (copy) se mai numete i yank iar cea de alipire (paste) se mai numete i put n vi. Comenzi de baz pentru copiere, alipire, modificare i anulare n vi
Tabelul 5.3
Comanda cw Semnificaie Are ca efect modificarea cuvntului (sau a prii din cuvnt) de la cursor pn la sfritul cuvntului. Se poziioneaz cursorul n locul de unde dorim s ncepem modificarea, apoi se apas cw, se introduce noul cuvnt i se apas n final tasta <ESC> Se modific 5 cuvinte Se nlocuiete caracterul pe care este poziionat cursorul cu alt caracter Are ca efect anularea ultimei comenzi terge, apoi alipete (paste) Copiaz, apoi alipete Copiaz o linie Alipete linia copiat sau tears sub linia curent Alipete linia copiat sau tears deasupra liniei curente

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

114

Editoare de text

5.3

Editorul pico

5.3.1 Generaliti Editorul pico este un editor de texte mai puin complicat de utilizat dect editorul vi, fiind integrat n celebrul program de pot electronic pine, dezvoltat la Universitatea din Washington. Uneori, nainte de intrarea n editorul pico trebuie setat tipul de terminal folosit (dac se utilizeaz un terminal vt100, atunci se poate utiliza comanda export TERM=vt100 pentru setarea tipului de terminal). Pornirea editorului se face simplu, introducnd la linia de comand:
$ pico [nume_fisier]

5.3.2 Operaii de baz Editorul pico ofer o bar de meniu cu cele mai utilizate comenzi n partea de jos a ecranului, dup cum se poate vedea n figura 5.4.

Figura 5.4 Ecranul editorului pico

115

UNIX

Inserarea textului Pentru a insera text n ecranul de editare pico, se ncepe pur i simplu introducerea textului, fr a se mai introduce alt comand (ca n cazul editorului vi). Pico insereaz textul introdus de la tastatur la stnga cursorului, deplasnd la dreapta textul existent (dac acesta exist). De fiecare dat cnd cursorul ajunge la captul rndului, caracteristica word wrap (desprirea pe linii) a editorului determin deplasarea cursorului la nceputul liniei urmtoare. Deplasarea cursorului Deplasarea cursorului se poate face prin intermediul tastelor direcionale (cu sgei) sau prin utilizarea combinaiilor de taste: Ctrl+f (forward - nainte), Ctrl+b (back - napoi), Ctrl+n (next - linia urmtoare) sau Ctrl+p (previous - linia anterioar). tergerea textului Caracterul de la stnga cursorului se terge cu tasta <BACKSPACE>, <DELETE> sau prin combinaia Ctrl+h. Pentru a terge caracterul de deasupra cursorului se apas Ctrl+d. Pentru tergerea liniei curente se apas Ctrl+k. Salvarea documentului Pentru a salva fiierul pe disc, se apas Ctrl+o. Pico afieaz numele fiierului curent, iar pentru salvarea fiierului cu alt nume trebuie ters vechiul nume i introdus numele dorit, apoi se apas tasta <RETURN>. Refacerea ecranului n cazul n care pe ecranul pico apar caractere ciudate, refacerea ecranului se face prin combinaia Ctrl+L.

116

Editoare de text

Ieirea din program Pentru a iei din editorul pico, se apas Ctrl+x. Dac au fost fcute unele modificri dup ultima salvare, pico va afia un mesaj prin care ntreab dac se dorete salvarea modificrilor. Se poate tasta y (yes - da) dac se dorete salvarea sau n (no - nu) dac nu se dorete salvarea. n momentul introducerii tastei y, pico afieaz numele fiierului, care poate fi modificat. Comenzile de baz ale editorului pico se gsesc n tabelul 5.5. 5.3.3 Alte faciliti Cutarea textului Cutarea irurilor de caractere se face n pico ncepnd de la poziia curent a cursorului spre sfritul fiierului. Pentru a ncepe cutarea se apas Ctrl+w (whereis - unde este). Pico va cere introducerea textului cutat. Pentru a ncepe cutarea, se introduce textul cutat i se apas <ENTER>. Pico va deplasa cursorul n locul n care se gsete prima apariie a textului cutat. Cutarea se poate repeta prin apsarea din nou a combinaiei Ctrl+w. Alinierea textului n momentul introducerii de text pe ecran, facilitatea word wrap a editorului pico ncepe o nou linie ori de cte ori este cazul. Uneori trebuie s aliniem textul introdus; pentru a re-alinia paragraful, trebuzie s poziionm cursorul pe paragraful respectiv i s apsm combinaia Ctrl+j. Anularea acestei aciuni i aducerea paragrafului la forma iniial se face prin combinaia Ctrl+u.

117

UNIX

Comenzi de baz n editorul pico


Tabelul 5.5
Comanda Ctrl+f Ctrl+b Ctrl+p Ctrl+n Ctrl+a Ctrl+e Ctrl+v Ctrl+y Ctrl+w Ctrl+l Ctrl+d Ctrl+^ Ctrl+k Ctrl+u Ctrl+i Ctrl+j Ctrl+t Ctrl+r Ctrl+o Ctrl+g Ctrl+x Efect Deplasarea cursorului nainte cu un caracter Deplasarea cursorului napoi cu un caracter Deplasarea cursorului pe linia anterioar Deplasarea cursorului pe linia urmtoare Deplasarea cursorului la nceputul liniei curente Deplasarea cursorului la sfritul liniei curente Deplasarea cursorului nainte cu o pagin Deplasarea cursorului napoi cu o pagin Caut text Reafieaz ecranul pico terge un caracter de la poziia cursorului ncepe selectarea textului ncepnd cu poziia cursorului Taie (cut) textul selectat sau linia curent Alipete (paste) ultimul text tiat la poziia cursorului Insereaz un tab n poziia cursorului Aliniaz paragraful curent Corectarea semantic Insereaz (read - citete) coninutul unui fiier la cursor Salveaz (output) fiierul Vizualizarea help-ului Se iese din pico, cu salvarea fiierului

Funcii de tiere i alipire Pentru a tia o linie cu ajutorul editorului pico trebuie s ne poziionm pe linia respectiv i s apsm Ctrl+k. Ne putem apoi poziiona n locul unde dorim alipirea liniei tiate. Alipirea se face cu ajutorul combinaiei Ctrl+u. De asemenea, se pot face tieri i alipiri (cut i paste)

118

Editoare de text

cu blocuri de text (nu doar linii ntregi). Aceast operaie presupune parcurgerea urmtorilor pai: 1. se mut cursorul pe primul caracter al textului ce urmeaz a fi tiat; 2. se apas Ctrl+^ pentru a ncepe marcarea; 3. se utilizeaz tastele direcionale pentru a selecta textul dorit; 4. se apas Ctrl+k pentru tierea textului; 5. se mut cursorul n locul unde dorim inserarea textului tiat; 6. se apas Ctrl+u pentru a alipi textul n noua poziie. Inserarea unui fiier text existent Pentru a insera coninutul unui fiier deja existent n poziia specificat de cursor, se va apsa Ctrl+r, iar pico va cere introducerea unui nume de fiier. Se poate introduce direct numele fiierului i apoi se apas <ENTER>, fie se poate apsa Ctrl+t pentru a selecta un nume dintr-o list de fiiere disponibile n directorul curent de lucru. Combinaia Ctrl+t determin apariia unui File Browser, n care putem folosi tastele direcionale pentru selectarea fiierului dorit i apoi se apas <ENTER>. Se poate selecta directorul printe (..) pentru a ne muta un nivel mai sus n structura de directoare. n afara faptului c se poate insera text, acest browser de fiiere poate fi folosit pentru a redenumi, terge sau copia un fiier. Pentru a iei din File Browser se apas tasta e. Refacerea editrii n cazul n care o sesiune pico se bocheaz, pico ncearc s salveze o copie a fiierului asupra cruia se lucra. Acest fiier salvat de pico se afl n directorul curent de lucru, avnd extensia .save. Ajutor Pentru vizualizarea paginilor de ajutor se va folosi combinaia Ctrl+g.

119

1. Shell-uri UNIX

6
6.1 6.1

SHELL-uri UNIX

Definiie i funciuni

Parte integrant a sistemului de operare UNIX, shell-ul este un program special utilizat ca o interfa ntre utilizator i inima sistemului de operare UNIX, un program denumit kernel[23]. n timp ce kernelul este ncrcat n memoria calculatorului din momentul iniializrii sale i pn la oprirea sistemului, toate celelalte programe, inclusiv programele de tip shell sunt stocate pe disc. Kernelul este, n fapt, administratorul ntregului sistem de operare UNIX; el iniiaz i controleaz procesele, administreaz memoria, sistemul de fiiere, comunicaiile i tot ce ine de resursele calculatorului. Shell-ul este un program utilitar ce este pornit n momentul conectrii utilizatorului la sistem, oferind posibilitatea utilizatorilor s interacioneze cu kernelul prin interpretarea comenzilor introduse fie direct de la tastatur, fie prin intermediul unui fiier de comenzi shell, numit fiier shell-script, sau, pe scurt, script. n momentul conectrii la sistemul UNIX shell-ul i ia atribuiile n primire, ndeplinindu-i rolul de interpretor al comenzilor introduse de ctre utilizator i care trebuie nelese de ctre kernel (este echivalentul interpretorului DOS command.com). n momentul introducerii unei comenzi, interpretorul de comenzi shell execut urmtorii pai: (1) interpreteaz sintactic linia de comand introdus; (2) interpreteaz metacaracterele, redirectrile, mecanismele pipe i controlul job-urilor i (3) verific existena comenzii/comenzilor introduse i dac acestea exist, sunt executate. Exist posibilitatea utilizrii shell-ului n dou moduri: interactiv sau prin intermediul unui fiier script. La nceput, utilizatorii care nva comenzi i cum s foloseasc sistemul UNIX folosesc modul interactiv al shell-ului. Mai trziu, odat cu utilizarea unor comenzi n mod frecvent, se impune crearea unor fiiere de comenzi acele fiiere shell-script. Execuia comenzilor prin intermediul unui shell-script nseamn utilizarea shell-ului drept limbaj de programare. Prin analogie cu DOS/Windows, fiierele 120

UNIX

shell-script sunt fiiere de tip batch de comenzi, care n sistemul de operare DOS au extensia .bat. Fiierele shell-script permit, pe lng utilizarea mai multor comenzi ce se execut (de regul) secvenial i faciliti de programare avansat, structuri de decizie, ciclare, testare de fiiere, .a. Pentru a putea scrie shell-script-uri trebuie cunoscute nu numai structurile de programare existente (condiionale, repetitive, etc.) dar i comenzile, utilitarele i modalitatea de funcionare a acestora n sistemul de operare UNIX. Printre programele utilitare existente n UNIX se afl i grep, sed sau awk ce reprezint instrumente deosebit de puternice pentru manipularea fiierelor i a rezultatelor comenzilor. 6.2 Variante de shell

n UNIX exist mai multe implementri ale interpretoarelor de comenzi, printre care: Bourne Shell (sh) AT&T shell C Shell (csh) - Berkeley shell Korn Shell (ksh) - include shell-ul Bourne Bourne Again Shell (bash - n Linux) Toate aceste tipuri de shell se comport aproximativ asemntor atunci cnd se lucreaz n modul interactiv. Odat cu folosirea acestora ca limbaje de scripting (programare) apar o serie de deosebiri legate de sintax, eficien etc. Dintre aceste tipuri de shell, shell-ul Bourne este shell-ul standard UNIX, de aceea vom prezenta pentru nceput caracteristicile shell-ului Bourne. De asemenea, majoritatea script-urilor scrise deja pentru administrarea sistemului (precum rc start i stop, shutdown) sunt shell-script-uri Bourne, iar cnd se lucreaz n modul single-user (mod excepional de lucru utilizat, de regul, pentru refacerea sistemului) acesta este shell-ul utilizat de administratorul sistemului conectat ca root. Shell-ul Bourne a fost conceput de firma AT&T i el este rapid, concis i compact. Valoarea implicit a prompter-ului este semnul dolar ($) pentru utilizatorii obinuii i semnul diez (#) pentru root (utilizatorul privilegiat). Shell-ul C (csh) a fost dezvoltat la Universitatea Berkeley California i a adugat o serie de noi funcionaliti, precum: istoricul comenzilor date anterior, utilizarea de alias-uri, aritmetic integrat sau auto-completarea numelor de fiiere i comenzi. Shell-ul C este preferat atunci cnd se utilizeaz interactiv, dar administratorii prefer s utilizeze shell-ul Bourne la scrierea shell-script-urilor, deoarece acesta din urm este mai rapid i mai

121

Shell-uri UNIX

simplu dect script-urile asemntoare scrise n C shell. Prompter-ul implicit n C shell este semnul procent (%) pentru utilizatorul obinuit. Shell-ul Korn (ksh) reprezint o extensie a shell-ului Bourne i a fost scris de David Korn de la AT&T. Au fost adugate o serie de noi funcionaliti fa de shell-ul Bourne i cel C. Printre acestea se numr: istoric editabil al comenzilor, alias-uri, funcii, aritmetic integrat, controlul job-urilor, coprocesare i faciliti de depanare. Shell-ul Bourne este aproape 100% compatibil cu shell-ul Korn; de aceea, vechile shell-script-uri scrise n Bourne shell vor rula i n Korn shell. Ca i n Bourne shell, valoarea implicit a prompter-ului pentru utilizatorul obinuit este simbolul dolar ($) i semnul diez (#) pentru root. 6.3 Scurt istoric

Primul shell cu adevrat important a fost introdus n versiunea V7 (versiunea 7 a variantei AT&T) UNIX n anul 1979 i a fost denumit dup programatorul Stephen Bourne, creatorul su. Ca limbaj de programare, shell-ul Bourne se bazeaz pe limbajul de programare Algol i a fost folosit iniial pentru a automatiza anumite sarcini administrative. Cu toate c acest shell este foarte popular pentru simplitate i vitez, are totui cteva minusuri la utilizarea interactiv (lipsa istoricului comenzilor, a alias-urilor i a controlului job-urilor). Pe de alt parte, shell-ul bash (Bourne Again Shell), dezvoltat de ctre Brian Fox de la FSF (Free Software Foundation) sub licen public GNU este shell-ul implicit pentru Linux i instalat automat ncepnd cu Solaris 8 (pe servere Sun). Bash ofer o serie de noi faciliti ce lipsesc n shell-ul standard Bourne (se pstreaz ns compatibilitatea cu acesta), nglobnd i cele mai bune faciliti din C shell i Korn shell. Facilitile shell-ului bash sunt: istoric al comenzilor introduse la linia de comand, editarea liniei de comand, controlul job-urilor, funcii, alias-uri, vectori, aritmetic integrat (n orice baz ntre 2 i 64), structuri de ciclare cu selecie pentru creare de meniuri, comanda let etc. Shell-ul C a fost creat la Universitatea Berkeley, California la sfritul anilor 70, fcnd parte din varianta 2BSD UNIX. Iniial, shell-ul C a fost scris de Bill Joy, oferind o serie de faciliti care nu erau cuprinse n shell-ul standard, shell-ul Bourne. Shell-ul C este bazat pe limbajul de programare C, iar atunci cnd este utilizat drept limbaj de programare folosete o sintax asemntoare cu cea din C. Ofer facilitile de istoric al liniei de comand, alias-uri, controlul job-urilor. Proiectat pe un calculator puternic, shell-ul C are tendina de a fi mai lent pe calculatoare mai puin puternice n comparaie cu shell-ul Bourne.

122

UNIX

Shell-ul TC reprezint o versiune mbuntit a shell-ului C, avnd o serie de noi faciliti, precum: editarea liniei de comand, posibilitatea rsfoirii istoricului, variabile, auto-completarea comenzii, corectare automat, planificarea job-urilor, etc. David Korn de la AT&T a inventat shell-ul Korn n 1986 i a devenit n mod oficial parte a distribuiei UNIX SVR4 n 1988. Shell-ul Korn, compatibil cu shell-ul Bourne, ruleaz nu numai pe sisteme UNIX, dar i pe OS/2, VMS i DOS. Ofer compatibilitate cu shell-ul Bourne, adugnd multe faciliti ale shell-ului C, fiind ns mai rapid i mai eficient dect acesta. Shell-ul Korn a avut o serie ntreag de versiuni; cea mai folosit versiunea a shell-ului Korn o reprezint versiunea aprut n 1988, cu toate c i cea din 1993 este deosebit de popular. Utilizatorii de Linux pot folosi o versiune free a shell-ului Korn, intitulat The Public Domain Korn Shell (pdksh), o clon a shell-ului Korn din 1988. Aceast versiune este free, portabil, compatibil POSIX. O alt versiune de shell, intitulat Z shell (zsh) este tot o clon Korn cu faciliti din TC shell, scris de Paul Falsted i disponibil free pe web. Datorit popularitii shell-ului bash i a importanei shell-ului Bourne ca shell clasic, n aceast carte vor fi prezentate aceste dou tipuri de shell. 6.4 Shell-uri pentru Linux

Cele mai importante variante de interpretoare pentru Linux sunt Bourne Again Shell (bash) i TC shell. Aceste shell-uri sunt instalate implicit pe sistemele Linux, iar ncepnd cu Solaris 8 i pe sistemele Sun. odat cu instalarea sistemului de operare Linux se obine acces la shell-urile i programele GNU, nu la shell-urile i programele standard UNIX. n Linux, cele mai populare shell-uri sunt bash i TC shell. Pentru a vedea ce versiuni de shell-uri sunt disponibile, trebuie cercetat fiierul /etc/shell, iar pentru a schimba shell-ul implicit n alt shell vom folosi comanda chsh (change shell), urmat de numele shell-ului dorit. De exemplu, pentru a modifica shell-ul n shell-ul Korn, vom introduce comanda:
$ chsh /bin/ksh

123

Shell-uri UNIX

6.5 6.5.1

Iniializarea sistemului i programul de login Iniializarea sistemului

n momentul pornirii sistemului, primul proces apelat este procesul ce se numete init. Fiecare proces are asociat un numr de identificare, denumit PID (Process Identification). Deoarece init reprezint primul proces apelat, acesta are PID=1. Rolul procesului init este acela de a iniializa sistemul i a porni alt proces (getty) ce deschide liniile pentru terminal, setnd standard input (stdin), standard output (stdout) i fiierul standard de eroare (standard error - stderr). Dup aceasta apare un prompter (de login) pe ecran. Fiierul standard de intrare este n mod normal tastatura, fiierul standard de ieire i cel de eroare sunt reprezentate de ecranul monitorului. Dup ce se introduce un nume de utilizator la prompterul de login, se cere o parol pentru autentificare. n acest moment, programul /bin/login verific identitatea utilizatorului prin analiza primului cmp din fiierul /etc/passwd (unde sunt stocate parolele). Dac numele de utilizator se regsete aici, urmtorul pas este acela de a verifica dac parola introdus este corect. Dup verificarea parolei, programul login definete un mediu iniial de lucru ce const din anumite variabile de sistem i acest mediu de lucru este transmis shell-ului. Variabilelor de sistem HOME, SHELL, USER i LOGNAME le sunt atribuite valori din fiierul passwd. Variabila HOME reprezint directorul home al utilizatorului; variabila SHELL reprezint numele shell-ului de login (ultimul cmp din fiierul passwd). Variabila USER i variabila LOGNAME reprezint numele utilizatorului. Printre alte variabile setate acum este i variabila PATH, ce reprezint o colecie de ci de cutare pentru comenzile introduse. n momentul terminrii execuiei programului login, acesta va lansa n execuie programul gsit n ultimul cmp al fiierului passwd, corespunztor liniei utilizatorului respectiv. Dac acest cmp este /bin/ksh, va fi executat shell-ul Korn; dac valoarea gsit este /bin/sh, se va porni shell-ul Bourne. Acest shell poart denumirea de login shell. Dup pornirea programului shell, se caut diverse fiiere generale de configurare iar apoi, n directorul home, se caut fiiere de configurare specifice utilizatorului respectiv. Dac acestea sunt gsite, se execut. Fiierele de iniializare sunt utilizate pentru a adapta mediul uilizatorului la propriile cerine. Dup ce s-au executat i aceste fiiere de configurare, apare un prompter pe ecran. Din acest moment, programul shell ateapt introducerea comenzilor.

124

UNIX

6.5.2

Interpretarea liniei de comand

n momentul introducerii unei comenzi la prompter, shell-ul citete o linie i interpreteaz linia de comand prin mprirea acesteia linia n cuvinte, denumite token-uri. Token-urile sunt separate de spaii i caractere tab, iar linia de comand se termin cu un caracter special denumit newline. Acest proces de interpretare al liniei de comand poart denumirea de analiz lexical. n urmtorul pas, shell-ul verific dac primul cuvnt introdus este o comand intern sau un program executabil pe disc. Dac este vorba despre o comand intern, aceasta va fi executat. n caz contrar, shell-ul va cuta n lista de directoare din variabila PATH pentru a gsi programul pe disc. Dac se gsete programul, shell-ul va incepe un nou proces (prin apelul fork) i apoi va executa programul. Dup aceasta, shell-ul va atepta pn cnd programul i ncheie execuia i apoi, dac este cazul, va afia starea programului care s-a ncheiat. n acest moment va aprea prompter-ul i ntreg procedeul descris mai sus se va relua la introducerea unei noi comenzi. 6.5.3 Tipuri de comenzi

n momentul execuiei unei comenzi, aceasta poate fi un alias, o funcie, o comand intern sau un program executabil pe hard disc. Un alias reprezint o prescurtare a unei comenzi existente i se aplic pentru shellurile C, TC, Korn i bash. Funciile sunt valabile n shell-urile Bourne (ncepnd cu versiunea AT&T System V, Release 2.0), bash i Korn, reprezentnd grupri de comenzi organizate sub forma unor proceduri separate. Funciile i alias-urile sunt definite n memoria shell-ului. Comenzile interne reprezint rutine interne ale shell-ului iar programele executabile sunt localizate pe hard disc. Shell-ul folosete variabila PATH pentru a cuta programele executabile pe hard disc i genereaz un apel fork de iniierea a unui proces copil nainte de execuia comenzii. n momentul n care shell-ul este gata s execute o comand, evalueaz tipul comenzii n urmtoarea ordine: 1) Alias-uri 2) Cuvinte cheie pentru shell 3) Funcii (n bash) 4) Comenzi interne 5) Programe executabile Dac, spre exemplu, comanda introdus este abc, shell-ul verific mai nti dac abc este un alias, apoi dac nu este cuvnt cheie (pentru 125

Shell-uri UNIX

shell). Dac nu, este o funcie sau comand intern? Dac nici acest lucru nu este valabil, atunci se verific (cutnd n directoarele specificate n variabila de sistem PATH) dac exist un program executabil pe hard disc cu acest nume. 6.5.4 Procese UNIX

Un proces reprezint o instan a unui program aflat n execuie i poate identificat prin numrul su de identificare PID. Cine administreaz procesele n UNIX? Nucleul sistemului de operare (kernel-ul), administreaz i controleaz aceste procese. Un proces este identificat de un program executabil, date i stiv, pointer de program i de stiv, regitri, precum i toate informaiile necesare pentru ca programul s ruleze. n momentul pornirii shell-ului, se iniieaz un proces. Shell-ul aparine unui grup de procese identificat prin identificatorul PID. Doar un singur grup de procese are controlul terminalului la un moment dat i se spune c ruleaz n foreground (la suprafa). n momentul procesului de login, shell-ul controleaz terminalul i ateapt introducerea unei comenzi la prompter.

Figura 6.1 Exemplu de listing al comenzii ps

Shell-ul poate iniia i alte procese. De fapt, n momentul introducerii unei comenzi la prompter sau atunci cnd aceasta este apelat dintr-un shell-script, shell-ul are sarcina s gseasc acea comand intern (dac este o comand intern) sau pe hard disc i apoi s execute acea comand. Acest lucru se face prin intermediul unui apel ctre kernel, denumit apel de sistem. Un apel de sistem reprezint de fapt o cerere adresat serviciilor kernel-ului i reprezint unica modalitate prin care un proces poate accesa hardware-ul sistemului. Exist o serie de apeluri de sistem ce permit proceselor s fie create, s se execute i s se termine. Procesele care ruleaz la un moment dat pe un sistem UNIX pot fi vizualizate cu ajutorul comenzii ps (process status). Comanda ps listeaz procesele aflate n execuie. n figura 6.1 avem un exempu de listing al comenzii ps. Pentru a vizualiza toate procesele ce ruleaz pe un sistem, se poate folosi comanda ps -ef (pentru SVR4) sau ps aux (pentru BSD sau Linux). 126

UNIX

Crearea proceselor se face n UNIX prin intermediul apelului de sistem fork. Cele mai importante apeluri de sistem sunt: fork, wait, exec i exit. Prezentm n continuare cteva caracteristici ale acestor apeluri de sistem. Apelul de sistem fork Un proces este creat n UNIX cu ajutorul apelului de sistem fork. Apelul fork creaz un duplicat al procesului apelant. Noul proces se numete copil iar procesul care l-a generat se numete printe. Procesul copil pornete imediat dup apelul fork i ambele procese partajeaz la nceput UCP (Unitatea Central de Procesare). Procesul copil menine o copie pentru: mediul procesului printe, fiierele deschise, identificatorii utilizatorului, valoarea umask, directorul curent de lucru i semnale. n momentul introducerii unei comenzi, shell-ul interpreteaz lexical linia de comand i determin dac primul cuvnt introdus este o comand intern sau o comand extern regsit ntr-un fiier pe hard disc. n primul caz, shell-ul execut comanda intern, dar n cel de-al doilea caz shell-ul apeleaz un apel fork pentru a face o copie a sa. Procesul copil va cuta comanda n directoarele specificate n variabila PATH; n acest timp procesul printe se afl n starea sleep. Apelul de sistem wait Procesul printe este programat s intre n starea sleep (de ateptare) n timp ce procesul copil execut redirectarea, mecanismele pipe i procesarea n background. Apelul de sistem wait face ca procesul printe s-i suspende execuia pn cnd unul dintre copiii si i ncheie activitatea. Dac procesul wait se desfoar normal, va returna PID-ul i exit-status-ul procesului copil care s-a ncheiat. Dac procesul printe nu este n stare de ateptare iar copilul termin activitatea, atunci procesul copil intr n starea zombie, rmnnd n aceast stare pn cnd fie apelul printe intr n starea wait, fie procesul printe se termin (pentru a nltura procesele zombie, sistemul trebuie repornit). Dac printele moare naintea copilului (care devine orfan), procesul init va prelua (adopta) un proces zombie orfan. Apelul de sistem wait asigur n acest caz i faptul c procesul se va termina n mod corespunztor. Apelul de sistem exec Dup introducerea unei noi comenzi la linia de comand, shell-ul genereaz n mod normal un apel fork, ce produce procesul copil. Dup cum am spus mai nainte, procesul copil este responsabil cu execuia comenzii introduse, prin intermediul apelului de sistem exec. n momentul n care programul executabil asociat comenzii este gsit, shell-ul cheam apelul 127

Shell-uri UNIX

exec cu numele comenzii drept argument. Kernelul ncarc noul program n memorie n locul shell-ului apelant, apoi procesul copil se suprapune peste noul program. Noul program devine proces copil i i ncepe execuia. Dei noul proces are propriile variabile locale, toate variabilele de mediu, fiierele deschise, semnalele, directorul curent de lucru sunt transmise noului proces. n momentul n care procesul se termin, shell-ul printe se trezete (iese din starea wait). Apelul de sistem exit Orice program i poate ncheia execuia prin apelul de sistem exit. n momentul n care un proces copil i ncheie execuia, el trimite un semnal (sigchild) i ateapt acceptul de terminare (exit) de la procesul printe. Orice program care se termin returneaz, de asemenea, o valoare corespunztoare ncheierii (cu succes sau nu) programului, denumit exit-status. Exit-status-ul reprezint un numr ntre 0 i 255. n general, un exit-status egal cu valoarea 0 (zero) indic faptul c programul s-a ncheiat cu succes i o valoare diferit de 0 n caz contrar. De exemplu, dac comanda cp a fost introdus la linia de comand, procesul shell printe va iniia prin fork un proces copil i va intra n starea sleep. Procesul copil va executa comanda cp n locul procesului printe, motenind toate variabilele de mediu, fiierele deschise, informaiile legate de utilizator,etc. n momentul terminrii execuiei comenzii cp, se va genera un exit iar procesul printe va iei din starea de ateptare, aprnd prompter-ul pe ecran. Fiecare shell are o variabil (intern) special prin care putem determina valoarea exit-status-ului ultimei comenzi ncheiate (variabila este $? pentru shell-ul Bourne). 6.5.5 Mediul de lucru i drepturi de acces

n momentul conectrii la sistem (login), shell-ul i pornete execuia, motenind o serie de variabile de sistem, fluxuri de I/O (Input/Output), precum i caracteristicile procesului rezultat din execuia programului /bin/login. n continuare, dac alt proces copil este iniiat de procesul printe, acest proces copil va moteni la rndul su caracteristicile procesului printe. Caracteristicile mediului constau n permisiunile procesului (cine deine procesul), directorul curent de lucru, masca de creare a fiierului (file mask), o serie de variabile speciale, fiiere deschise, semnale. n momentul login-ului, shell-ul primete o identitate; are un identificator al utilizatorului real (UID - User Identification), unul sau mai muli identificatori de grup (GID - Group Identification), un identificator al utilizatorului efectiv (EUID - Effective User Identification) i un 128

UNIX

identificator al grupului efectiv (EGID - Effective Group Identification). Iniial, EUID i EGID sunt identici cu UID i, respectiv, GID. Aceti identificatori se gsesc n fiierul passwd, fiind utilizai de ctre sistem pentru a identifica utilizatorii i grupurile de utilizatori. Identificatorii EUID i EGID determin drepturile pe care le are un proces, referitoare la operaiile de citire, scriere sau execuie a unui fiier. n cazul n care EUID i UID ale unui proces coincid, procesul are drepturile de acces ale proprietarului asupra fiierului. Dac EGID i GID ale unui proces coincid, acest proces deine privilegiile grupului proprietar. Identificatorul UID (ce se regsete n fiierul /etc/passwd, al treilea cmp) este un numr pozitiv ce este n mod unic asociat cu numele de login (numele utilizatorului). n momentul operaiei de login, shell-ul primete identificatorul UID i toate procesele ce vor fi iniiate de acesta vor moteni drepturile sale de acces. Orice proces care ruleaz cu un UID=0 aparine super-utilizatorului root i are, astfel, drepturi de root. Identificatorul GID realizeaz asocierea numelui de utilizator cu un nume de grup, regsindu-se n acelai fiier /etc/passwd pe coloana a 4-a. Identificatorii efectivi EUID i EGID pot fi modificai; prin modificarea lui EUID (sau EGID) ctre alt utilizator, putem deveni proprietarii unui proces ce aparine altui utilizator. Programele ce modific identificatorii EUID i EGID sunt setuid i setgid. De aceea, programele setuid sunt deseori surse de bree n securitatea sistemului. Programul /bin/passwd este un exemplu de program setuid ce ofer drepturi de root. Comanda umask n momentul crerii unui nou fiier, acesta are o serie de drepturi de acces implicite. Aceste drepturi de acces sunt determinate de programul ce a creat fiierul, avnd n vedere c procesele copil motenesc o aa numit masc implicit (default mask) de la procesele printe. Utilizatorul poate modifica aceast masc prin utilizarea comenzii umask. Comanda umask se utilizeaz atunci cnd dorim s modificm masca implicit. Iniial, umask este 000, ceea ce ofer unui director drepturile 777 (rwxrwxrwx) i unui fiier drepturile 666 (rw-rw-rw-). Pe majoritatea sistemelor, umask este setat iniial la valoarea 022 de ctre programul /bin/login sau de ctre fiierul de configurare iniial /etc/profile. Dar cum se calculeaz drepturile de acces n funcie de valoarea lui umask? Pentru directoare, se scade valoarea lui umask din valoarea 777, iar pentru fiiere se scade valoarea lui umask din valoarea 666. Astfel, pentru un umask egal cu valoarea 022, un director va avea drepturile 755 (rwxr-xr-x), iar un fiier va avea drepturile de acces 644 (rw-r--r--). Imediat dup setarea

129

Shell-uri UNIX

valorii lui umask, toate fiierele i directoarele nou create vor avea noile drepturi de acces specificate, conform exemplului de mai nainte. Comanda chmod Pentru a modifica drepturile de acces la anumite fiiere i/sau directoare, se poate utiliza comanda chmod (change mode). Pentru fiecare fiier de pe un sistem UNIX, exist un unic proprietar al acestuia. Doar proprietarul i utilizatorul root au dreptul de a modifica drepturile de acces la un anumit fiier sau director. Cele opt posibiliti de stabilire a drepturilor de acces la fiiere
Tabelul 6.2
Valoare octal 000 001 010 011 100 101 110 111 Valoare zecimal 0 1 2 3 4 5 6 7 Drepturi de acces ----x -w-wx r-r-x rwrwx

Fiecare fiier UNIX are o serie de drepturi de acces (citire, scriere, execuie) pentru proprietar, grupul din care face parte i restul utilizatorilor. Aceste drepturi de acces sunt stocate n cmpul mode al inode-ului fiierului. Comanda chmod este deci folosit pentru a modifica drepturile de acces la un fiier sau director. Utilizatorul trebuie s fie proprietarul fiierului pentru a putea modifica aceste drepturi (identificatorul EUID al apelantului trebuie s fie acelai cu UID, sau root). n tabelul 6.2 avem ilustrate cele opt posibiliti de drepturi de acces la fiiere. De asemenea, n figura 6.3 sunt prezentate cteva exemple de utilizare a comenzii chmod. n primul caz, argumentul comenzii chmod este 754, aceasta nsemnnd rwx pentru proprietar, r-x pentru grup i r-- pentru ceilali utilizatori. n cazul al doilea, este adugat (opiunea +) permisiunea de scriere (w) pentru grup. n a treia comand, se iau (opiunea -) drepturile de citire (r) i execuie (x) pentru grup i ceilali utilizatori, iar n ultimul exemplu, toi (a-all) utilizatorii primesc (doar) dreptul de citire. Operatorul egal (=) face ca toate drepturile anterioare s fie resetate la noua valoare.

130

UNIX

Figura 6.3 Exemple de utilizare a comenzii chmod

Comanda chown Comanda chown (change owner) modific proprietarul i grupul pentru fiiere i directoare. Ca i n cazul comenzii chmod, doar proprietarul i root au dreptul de a face acest lucru (pe anumite versiuni de UNIX, precum BSD, doar utilizatorul root poate face acest lucru). n figura 6.4 avem un exemplu de utilizare a acestei comenzi (se modific proprietarul fiierului test din root n daemon).

Figura 6.4 Exemplu de utilizare a comenzii chown

Directorul de lucru n momentul procesului de login, fiecare utilizator este poziionat ntr-un director anume, care se numete directorul home. Directorul home este motenit de toate procesele iniiate din cadrul acestui shell. Orice proces copil poate modifica propriul director de lucru, dar aceste modificri nu vor afecta procesul shell printe. Comanda cd (change directory) este o comand intern a sistemului UNIX. Fiecare shell deine propria copie a comenzii cd. O comand intern este executat de shell direct ca parte a propriului cod; shell-ul nu face apeluri fork i exec atunci cnd execut comenzi interne. Dac un alt shell-script este iniiat prin fork de ctre procesul printe, comanda cd va fi executat n shell-ul copil i directorul va fi modificat aici. Atunci cnd procesul copil se termin, procesul printe va fi n acelai director ca i nainte de a fi pornit procesul copil. n figura 6.5 este ilustrat acest fapt. 131

Shell-uri UNIX

Figura 6.5 Directorul de lucru

Semnale n momentul n care un semnal trimite un mesaj unui proces, acesta din urm se termin. Putem trimite semnale unui proces prin apsarea tastelor BREAK, DELETE, QUIT i STOP, iar toate procesele acelui terminal vor fi afectate de semnalul trimis. Putem opri un proces aflat n execuie prin comanda kill. Shell-ul permite manipularea semnalelor trimise programelor, fie prin ignorarea lor, fie prin specificarea unei aciuni n momentul apariiei unui anumit semnal. Mai multe detalii legate de semnalele UNIX sunt prezentate n seciunea 7.6.7. 6.6 Scrierea unui shell-script

n momentul n care utilizm facilitile de limbaj de programare ale shell-ului, vom construi programe (shell-script-uri) care cuprind comenzi UNIX i constructori de control shell. Cum realizm acest lucru? Utiliznd un editor de texte, vom scrie comenzile i construciile shell i vom salva fiierul cu un nume oarecare (script.sh, spre exemplu). Liniile din cadrul shell-script-ului vor fi interpretate una cte una de ctre shell (avem de-a face cu programe interpretate, nu compilate). De regul, prima linie dintr-un fiier shell-script indic tipul de shell utilizat. Spre exemplu, dac folosim shell-ul Bourne, prima linie va arta astfel:
#!/bin/sh

iar dac utilizm shell-ul bash, prima linie va arta:


#!/bin/bash

Dup ce salvm fiierul, trebuie s i dm drepturi de execuie (vom folosi comanda chmod) i n acest moment suntem gata s l rulm. Putem lansa n execuie programul intitulat script.sh astfel (./ semnific faptul c acesta se afl n directorul de lucru curent):
$ ./script.sh

132

1. Bourne Shell

7
7.1

BOURNE SHELL

Tipuri de operatori i comenzi

Ca n toate limbajele de programare, operatorii permit programatorilor s utilizeze diverse operaii (aritmetice, logice, string etc.) asupra variabilelor. Bourne shell suport trei tipuri de operatori: aritmetici de test logici Operatorii aritmetici sunt folosii doar pentru operaiile cu numere ntregi. Operatorii de test sunt folosii pentru operaii cu fiiere, cu variabile string i cu ntregi. 7.1.1 Comanda test

Aceast comand are forma: test <conditie> sau [ <conditie> ], atunci cnd este folosit ca parte a unei comenzi if. Observaie: <conditie> are forma: [<operand1>][<operator>]<operand2> Exemple:
$ test $sir1 != $sir2

(n exemplele folosite semnul $ de la nceputul rndului reprezint prompter-ul shell-ului). Condiia va ntoarce o valoare zero (adevrat) dac variabila sir1 este diferit ca valoare de variabila sir2 i o valoare diferit de zero (fals) n caz contrar. Aceast valoare poate fi verificat prin intermediul lui exit 133

UNIX

status (parametrul special shell $?) care ntoarce valoarea de adevr a ultimei operaii efectuate. Fie secvena de comenzi urmtoare:
$ $ $ $ var1=15 var2=20 test $var1=$var2 echo $?

Se va afia valoarea 1, care semnific faptul c testarea s-a ncheiat cu valoarea "false" (variabila var1 are o valoare diferit de variabila var2). 7.1.2 Operatori pentru fiiere

Acetia sunt operatori unari (cu un singur argument) i de cele mai multe ori argumentul este numele unui fiier. Dintre aceti operatori amintim: -d <fiier> : este director? -f <fiier> : este fiier obinuit? -g <fiier> : are setat identificatorul GID? -r <fiier> : poate fi citit? -s <fiier> : este de lungime diferit de zero? -w <fiier> : poate fi modificat? -x <fiier> : este fiier executabil? Exemplu. Fie comanda:
$ ls -las

cu efectul urmtor:
total 5 4 drwxrwxrwx 4 drwxrwxrwx 2 -rwxrwxrwx 1 -rwxrwxrwx 2 -rwxrwxrwx 1 1 1 1 1 root root 2048 Feb15 18:00 . root root 2048 Feb15 18:10 .. razvan cib 1022 Dec15 17:45 .profile razvan cib 102 Feb16 17:45 stud.dat razvan cib 1102 Dec10 17:45 examen.dat

134

Bourne shell

Fie comanda:
$ test -f stud.dat; echo $?

Se va afia 0, avnd n vedere c stud.dat este ntr-adevr fiier obinuit. Exerciiu: Ce se va afia pentru urmtoarele comenzi?
$ $ $ $ $ test test test [ -r [ -w -d examen.dat; echo $? -x examen.dat; echo $? -s examen.dat; echo $? examen.dat ] ; echo $? stud.dat ] ; echo $?

7.1.3

Operatori pentru iruri de caractere

Operatorii folosii pentru operaii cu iruri de caractere sunt: <sir1> : este sirul <sir1> nenul? -n <sir1> : are sirul <sir1> lungimea diferita de zero? -z <sir1> : are sirul <sir1> lungimea zero? <sir1>=<sir2> : este sirul <sir1> identic cu <sir2>? <sir1>!=<sir2> : este sirul <sir1> diferit de <sir2>? Observaie: n general, este bine ca variabilele shell folosite n testare s fie ncadrate de ghilimele: "nume_variabila". Exemple. Atribuire cu valoare null:
$ var=

135

UNIX

Comanda:
$ test $var=hello ; echo$?

nu este corect deoarece $var trebuie s apar ntre ghilimele; n concluzie, corect este:
$ test $var=hello; echo $?

(Explicaie: comanda test ateapt 3 parametri: $var, =, hello. Conversia efectiv a lui $var la valoarea sa se face nainte de interpretarea ntregii comenzi. Deoarece valoarea lui $var este null, va rezulta interpretarea unei comenzi de genul test =hello, de unde rezult eroarea). Ghilimelele au rolul de separator pentru caracterul null. Exerciiu. Fie atribuirile:
$ $ $ $ sir1=dan sir2=maria sir3=dan sir4=

1. Care dintre comenzile urmtoare vor produce mesaje de eroare la execuie?


a. b. c. d. e. [ [ [ [ [ $sir1 ] ; echo $? -n $sir3 ] ; echo $? $sir1=$sir4 ] ; echo $? "$sir4"="$sir3" ] ; echo $? -z $sir4 ] ; echo $?

2. Care dintre comenzile urmtoare vor avea rezultat un exit status egal cu zero?

136

Bourne shell

a. b. c. d. e.

[ [ [ [ [

"$sir1"!="$sir2" ] ; echo $? -z "$sir3" ] ; echo $? -n "$sir4" ] ; echo $? "$sir1"="$sir3" ] ; echo $? "sir4" ] ; echo $?

7.1.4 Operatori pentru tipul integer Sintaxa utilizrii operatorilor pentru operaii cu numere ntregi este:
[ int1 operator int2 ]

iar operatorii utilizai sunt: -eq : se testeaz egalitatea lui int1 cu int2 -ge : se testeaz dac int1 este mai mare sau egal dect int2 -gt : se testeaz dac int1 este mai mare strict dect int2 -le : se testeaz dac int1 este mai mic sau egal dect int2 -lt : se testeaz dac int1 este mai mic dect int2 -ne : se testeaz dac int1 este diferit de int2 Exerciii. 1. Fie atribuirile:
int1=5 int2=10 int3=55 int4=5

Ce vor afia comenzile:


a. b. c. d. e. [ [ [ [ [ "$int1" "$int2" "$int4" "$int3" "$int4" -gt -lt -le -eq -ne "int2" ] ; echo $? "$int3" ] ; echo $? "$int1" ] ; echo $? "$int4" ] ; echo $? "$int1" ] ; echo $?

137

UNIX

2. Fie atribuirile:
V1=007 v2=7

Ce vor afia fiecare dintre comenzile:


a. [ "$v1" = "$v2" ] ; echo $? b. [ "$v2" -eq "$v2" ] ; echo $?

7.1.5 Operatori pentru tipul boolean Operatorii utilizai sunt: 1. ! <expresie> : expresie fals? 2. <expresie1> -a <expresie2> ambele adevrate? 3. <expresie1> -o <expresie2> una dintre ele adevrat? Exemplul 1. Fie atribuirile:
v1=5 v2=10

Ce va afia comanda:
[ !"$v1" -eq "$v2" ] ; echo $? (0)

Exemplul 2. Fie comanda:


[ -f fisier -a -x "fisier" ]

138

Bourne shell

Rezultatul va fi zero dac fiier este att fiier obinuit ct i executabil. Exemplul 3. Fie comanda:
[ "$var" -qt 1 -a "$var" -lt 90 ]

Rezultatul este zero dac variabila var are o valoare cuprins ntre 1 i 90 (strict). Observaie. Operatorul -a are o prioritate mai mic dect operatorii de comparaie pentru ntregi. Exemplul 4. Fie comanda:
[ -r "stud" -o -d "stud" ]

n acest caz, rezultatul este zero dac stud poate fi citit sau dac este director. Exemplul 5. Fie comanda:
[ "$luna" -gt 12 -o "$ziua" -gt 31]

Rezultatul este zero dac luna este mai mare dect 12 sau dac ziua are o valoare mai mare dect 31. 7.1.6 Operatori pentru tipul logic

Operatorii utilizai sunt: 1. && 2. ||

139

UNIX

Aceti operatori permit execuia unei comenzi n cazul n care comanda precedent se ncheie cu succes sau nu. Astfel, dac avem urmtoarea construcie: comanda1 && comanda2, atunci comanda2 este executat dac exit status-ul comenzii comanda1 este zero. n mod asemntor, pentru construcia comanda1 || comanda2, comanda2 este executat doar dac exit status-ul comenzii comanda1 este diferit de zero. Exemplul 1. Fie comanda:
[ -x fisier_prog ] && fisier_prog

Dac fiierul fsier_prog este executabil, atunci se lanseaz n execuie. Exemplul 2. Fie comanda:
[ "$luna" -le 12 -a "$ziua" -lt 32 ] || \ echo Data invalida $an $luna $ziua

Dac luna sau ziua au valori invalide, atunci se execut comanda echo. Observaii. 1. Caracterul "\" (backslash) de la sfritul liniei anuleaz semnificaia special a caracterului newline i l consider caracter whitespace. Cu alte cuvinte, comanda se continu pe linia urmtoare. 2. Parantezele rotunde (,) au semnificaie special i nu pot fi folosite n shell-script-uri n scopul gruprii diverselor comparri. Pentru a ignora semnificaia special a parantezelor ntr-o comand se folosete tot caracterul de evitare "\". Comanda anterioar poate fi rescris astfel:
[ \("$luna" -le 12 \) -a \("$ziua" -lt 32 ] \)|| \ echo Data invalida $an $luna $ziua

140

Bourne shell

7.1.7

Operatori aritmetici

Operatorii aritmetici sunt: +, -, *, /, % (mprire modulo). Deoarece shell-ul nu are alt concept de dat dect character string (ir de caractere), pentru a se putea face calcule aritmetice se va folosi comanda expr, care informeaz shell-ul c irul de caractere ce urmeaz dup expr trebuie evaluat ca expresie matematic. Exemplul 1. Fie atribuirile:
x=9 x=$x+6

n acest caz, comanda echo "$x" va afia 9+6 i nu rezultatul adunrii. Exemplul 2. Comanda expr are de-a face numai cu numere ntregi, astfel rezultatul expr 15 / 6 va fi 2. Observaii. 1. Operanzii i operatorii dintr-o expresie aritmetic trebuie separai de cel puin un spaiu. Astfel, dac scriem comanda de mai sus fr spaii ntre 15 i 6 : expr 15/6, rezultatul va fi 15/6. 2. Deoarece operatorul "*" are o semnificaie special pentru shell, trebuie ca atunci cnd vrem s facem o operaie de nmulire, s folosim caracterul de evitare (\). Deci, dac x=3, y=4, z=5, atunci expr $x * $y este o comand eronat, pe cnd expr $x \* $y \* $z va avea ca rezultat 60. 3. Cea mai folosit operaie este incrementarea:
var=`expr $var + 1`

141

UNIX

7.2 7.2.1

Gramatica Shell Comenzi simple

O comand este o secven de atribuiri (opional) urmate de cuvinte separate de spaii i redirectri, terminate cu un operator de control (||, &, &&, ; , ;; , ( , ) , | , <newline>). Primul cuvnt reprezint comanda ce va fi executat iar celelalte sunt interpretate ca argumente ale comenzii. Valoarea ntoars de o comand este exit status, sau valoarea numeric 128+n dac respectiva comand se ncheie cu semnalul n. 7.2.2 Conducte (pipelines)

O secven pipeline este aceea n care una sau mai multe comenzi sunt separate de simbolul pipe ( | ) - bar vertical. Formatul general al unei secvene pipeline este: [!] comanda1 [| comanda2 ...] Ieirea standard a comenzii 1 este conectat la intrarea standard a comenzii 2. Dac apare caracterul de negare (!), exit status-ul pipeline-ului va fi valoarea negat a exit status-ului ultimei comenzi. Shell-ul ateapt terminarea tuturor comenzilor din pipeline nainte de a ntoarce un rezultat. Fiecare comand dintr-o secven pipeline este executat ca un proces separat (ntr-un sub-shell). 7.2.3 Redirectare

Redirectarea fiierelor standard de intrare i de ieire ctre alte dispozitive periferice sau fiiere se face folosind operatorii > , >> , < , << . Operatorii > i >> se folosesc pentru redirectarea fiierului standard de ieire (output-ului). Exemple. ls -al > f1 - aceast comand redirecteaz afiarea comenzii ls n fiierul f1 n loc ca ieirea s fie afiat pe ecran. ls -al >> f1 - aceast comanda redirecteaz afiarea comenzii ls n fiierul f1 prin adugare la sfritul lui f1 (fiierul f1 nu este suprascris).

142

Bourne shell

Operatorul < se folosete pentru redirectarea fiierului standard de intrare (input-ului). Exemplu.
$ mail serban < mesaj

Aceast comand trimite un mesaj (preluat din fiierul mesaj) prin email utilizatorului serban. 7.2.4 Liste

O list este o secven de una sau mai multe pipelines separate de unul sau mai muli operatori ; , & , && sau || i terminat cu ; , & sau <newline>. Dac o comand se termin cu operatorul de control &, shell-ul execut comanda respectiv n background ntr-un subshell. Shell-ul nu ateapt terminarea comenzii i ntoarce valoarea zero. Comenzile separate de caracterul ; sunt executate secvenial, shell-ul ateapt terminarea fiecreia dintre comenzi, iar valoarea ntoars este exit status-ul ultimei comenzi executate. Operatorul && se folosete sub forma: comanda1 && comanda2 i n acest caz comanda2 este executat dac i numai dac comanda1 ntoarce un exit status zero. Operatorul || se folosete astfel: comanda1 || comanda2 , comanda2 executndu-se dac i numai dac comanda1 returneaz un exit status diferit de zero. Exit status-ul returnat este acela al ultimei comenzi executate. 7.2.5 Comenzi compuse

Exist dou modaliti de grupare a mai multor comenzi: prin folosirea parantezelor rotunde ( ) i prin folosirea acoladelor { }. Astfel, construcia urmtoare: (lista_de_comenzi) face ca modificrile aduse mediului de comenzile respective s nu aib efect dup terminarea comenzii (se ruleaz ntr-un subshell). Construcia {lista_de_comenzi;} face ca modificrile s aib efect asupra mediului existent deoarece lista de comenzi este executat n mediul shell existent. 143

UNIX

7.2.6

Caracterul escape

Caracterul escape (\) are o semnificaie special n shell, fiind folosit, de regul, pentru a se ignora semnificaia special a unor caractere. Spre exemplu, folosit la sfritul unui rnd i urmat de caracterul <newline>, \ este considerat ca i continuator de linie, astfel nct comanda se poate continua pe linia urmtoare. Se poate folosi aceast facilitate atunci cnd avem de-a face cu comenzi foarte lungi pe care le putem scrie mai convenabil pe dou sau chiar mai multe linii. Caracterul backslash i pstreaz semnificaia special dac este urmat de $ , ` , " , \ sau <newline>. 7.2.7 Comentarii ntr-un shell-script

Comentariile ntr-un shell-script se introduc folosindu-se caracterul #, care face s se ignore caracterele existente dup semnul # i pn la sfritul liniei respective (excepie face construcia #!nume_shell care apare pe prima linie a shell-script-ului i specific tipul de shell utilizat). 7.2.8 Variabile

O variabil este o entitate ce memoreaz valori ntr-un mod asemntor unei variabile ntr-un limbaj de programare convenional. O variabil este setat atunci cnd i se atribuie o valoare (variabila=valoare), putnd fi dezactivat folosind comanda unset. Variabilele shell pot fi modificate n mod dinamic de ctre interpretor sau atribuite la intrarea n sesiune. Dintre variabilele modificate dinamic enumerm: $# - reprezint numrul parametrilor poziionali ai unui program shell; $? - reprezint exit status-ul (codul de revenire) celei mai recente comenzi executate; $- - reprezint opiunea curent cu care a fost lansat shell-ul; $$ - reprezint identificatorul de proces al shell-ului; $! - reprezint identificatorul de proces al celei mai recente comenzi lansate n background; $0 - reprezint numele shell-ului sau al shell-script-ului; $1..$9 - reprezint argumentele (parametrii) ultimei comenzi lansate n execuie la linia de comand; $_ - reprezint ultimul argument al comenzii anterioare.

144

Bourne shell

Dintre variabilele atribuite la intrarea n sesiune enumerm: $HOME - reprezint directorul atribuit utilizatorului (directorul implicit) la intrarea n sesiune; $PATH - reprezint lista directorilor ce sunt parcuri de shell la cutarea unui fiier executabil corespunztor comenzii introduse; $PS1 - reprezint prompter-ul asociat interpretorului; $PS2 - reprezint al doilea prompter (pentru continuarea liniei de comand, cel implicit este >); $MAIL - reprezint numele directorului implicit pentru pota electronic; $LOGNAME - reprezint numele de login al utilizatorului; $SHELL - reprezint numele interpretorului de comenzi implicit atribuit la intrarea n sesiune (acesta se poate schimba folosind comanda chsh); $TERM - reprezint tipul de terminal folosit de editorul vi i de alte editoare orientate pe ecran. 7.3 7.3.1 Instruciuni de selecie Instruciunea if

Sintaxa acestei instruciuni este:


if <com_test1> then <secventa_comenzi1> else <secventa_comenzi2> fi

unde else este opional. n astfel de situaii este folosit scrierea testrilor folosind notaia cu paranteze drepte n loc de comanda test.

145

UNIX

Exemplul 1.
unitati=0 if [ $contor -lt 10] then unitati=`expr $unitati + 1` else unitati=0 zeci=1 fi

Instruciunile if pot fi ncuibate, dup modelul:


if <com_test1> then if <com_test2> then <secventa_comenzi1> fi else if <com_test3> then <secventa_comenzi2> fi fi

O alternativ a construciei else...if este dat de elif:


if <com_test1> then <secventa_comenzi1> elif <com_test2> then <secventa_comenzi2> else <secventa_comenzi3> fi

146

Bourne shell

Exemplul 2. Fie un shell-script denumit verif_fisier care ia drept argument un nume de fiier i verific dac este director sau fiier obinuit:
if [ -f "$1" ] then echo "$1 este fiier obisnuit!" elif [ -d $1 ] then echo "$1 este director!" fi

7.3.2

Comanda null

Comanda null este reprezentat de caracterul special : (n englez colon) i este o comand care nu face nimic i returneaz un exit-status egal cu zero. Aceast comand se poate utiliza n cadrul unei comenzi if cnd nu avem nici un mesaj de afiat sau alt comand de efectuat (conform sintaxei comenzii if trebuie ns introdus o comand dup cuvntul cheie then pentru a nu produce o eroare). Fie exemplul urmtor:
#!/bin/sh nume=george if grep $nume database > /dev/null 2>&1 then : else echo $nume nu a fost gasit in baza de date! exit 1 fi

Conform acestui shell-script se caut n fiierul database irul de caractere george folosind comanda grep. Dac acest ir de caractere este gsit, se execut comanda null care va returna un exit-status de valoare zero (programul se termin cu succes); dac nu, se va afia mesajul corespunztor faptului c george nu a fost gsit n baza de date i programul se va ncheia cu un exit-status egal cu 1. 147

UNIX

7.3.3

Instruciunea case

Sintaxa instruciunii case este:


case <valoare> in sablon_1) <comanda11> <comanda12> ... <comanda1n>;; sablon_2) <comanda21> <comanda22> ... <comanda2n>;; ... sablon_m) <comandam1> <comandam2> ... <comandamn>;; esac

Observaie. Putem utiliza metacaracterul * pentru a specifica orice ablon, dac nici unul nu a fost adevrat. Exemplul 1. Presupunem c avem un program care cere o opiune pentru urmtorul meniu:
Alegeti opiunea dintre variantele: 1...Afisarea unui fisier 2...Stergerea unui fisier 3...Iesire din program

Codul de program pentru citirea opiunii i verificarea acesteia este: Observaie: 148

Bourne shell

Dac utilizatorul trebuie s introduc o liter n locul unei cifre i dorim s nu conteze dac litera introdus este majuscul sau nu, putem s nlocuim 1) cu a|A) n cazul n care "A" este opiunea pentru afiarea unui fiier, 2) cu s|S) n cazul n care "S" este opiunea pentru tergerea unui fiier i 3) cu i|I) n cazul n care "I" este opiunea pentru ieirea din program. Exemplul 2. Considerm programul urmtor:
#!/bin/sh # Nume shell-script: culori echo "Ce culoare va place? " read culoare case "$culoare" in [Aa]l??????) echo $culoare este culoarea cerului! ;; [Vv]erde) echo Padurea este $culoare ! ;; galben | portocaliu) # Bara verticala semnifica "sau" echo $culoare este o culoare calda!;; *) echo Nu stiu nimic despre culoarea $culoare;; esac echo "Sfarsit case"

Explicaii: Se citete la nceput un ir de caractere care este atribuit variabilei culoare. Comanda case evalueaz expresia $culoare. n cazul n care culoarea introdus ncepe cu A sau a, continu cu litera l i urmeaz alte 6 caractere (pentru a se forma Albastru sau albastru), se afieaz mesajul corespunztor i instruciunea case se ncheie. Dac nu este ndeplinit prima condiie, se continu cu verificarea celorlalte dou condiii (pentru culorile verde, apoi pentru galben i portocaliu) i dac nici acestea nu sunt ndeplinite se va afia mesajul care corespunde opiunii *, ce reprezint toate celelalte cazuri (un fel de else n cazul instruciunii case, atunci cnd toate celelalte condiii anterioare nu au fost ndeplinite). n final, instruciunea case se termin cu cuvntul cheie esac i este afiat mesajul de ieire din instruciunea case.

149

UNIX

7.4 7.4.1

Instruciuni iterative Instruciunea for

Sintaxa instruciunii for este:


for <variabila> in <valoare_1> <valoare_2> <valoare_n> do <comenzi> done

Exemplul 1. Secvena urmtoare de program copiaz fiierele cu numele fis1, fis2 i fis3 n directorul copie din directorul curent:
for f in fis1 fis2 fis3 do cp $f copie done

Comanda for poate fi folosit pentru ciclarea printre elementele coninute de variabila special $*. Secvena urmtoare afieaz argumentele cu care este apelat shell-script-ul (presupunem c l denumim afisare_arg).
for argum in $* do echo "$argum" done

Exemplul 2. n acest exemplu presupunem c avem de trimis acelai mesaj prin e-mail mai multor persoane. Adresele de e-mail ale persoanelor vor fi introduse anterior ntr-un fiier text simplu, fiecare adres de email pe cte o linie. Dac denumim fiierul cu adresele de e-mail adrese, acesta va arta astfel:

150

Bourne shell

stud anca@yahoo.com cristi@hotmail.com george paul serban@k.ro

Observaie. Avem de-a face n exemplul de mai sus cu trei adrese complete de email i cu trei adrese locale corespunztoare utilizatorilor locali stud, george i paul. Mesajul pe care l trimitem se afl n fiierul mesaj. Cu aceste explicaii, shell-script-ul este:
# Numele script-ului: trimite_mesaj for persoana in `cat adrese` do mail $persoana < mesaj echo A fost trimis mesajul lui $persoana. done echo "Mesajul a fost transmis."

7.4.2

Instruciunea while

Sintaxa instruciunii while este:


while <comanda_adev> do <comenzi> done

Exemplul 1. Secvena urmtoare de program citete o opiune i execut comenzile specificate att timp ct variabila final are valoarea "n".

151

UNIX

final=n while [ "$final" = n ] do read opiune case "$opiune" in 1) echo "Introduceti numele fiierului afisat:" read nf cat "$nf";; 2) echo "Introduceti numele fiierului sters:" read nf rm "$nf";; 3) fin=y echo "Iesire din program..." sleep 5;; *) echo "Opiune invalida!";; esac done

ce

va

fi\

ce

va

fi\

Exemplul 2. Programul urmtor afieaz pe rnd argumentele cu care a fost apelat. Folosind comanda shift putem face s afim nti toate argumentele apelului, apoi mai puin cu unul, .a.m.d., pn la ultimul argument.
while [ $# -gt 0 ] do echo $* shift done

Presupunnd c programul se numete afisarg, apelul: $ afisarg 1 2 3 4 5 va afia: 12345 2345 345 45 5

152

Bourne shell

7.4.3

Instruciunea until

Sintaxa instruciunii until este:


until <comanda_adev> do <comenzi> done

De regul, instruciunea until se folosete atunci cnd trebuie executat o secven de instruciuni pn n momentul n care o comand se termin cu valoarea de adevr zero (true). Exemplul 1. Fie secvena urmtoare de program care verific dac un utilizator al crui nume este specificat drept argument n momentul apelului shell-script-ului s-a conectat la sistem. n acest moment se afieaz mesajul: "Utilizatorul <nume_utilizator> s-a conectat!".
nume=$1 until who | grep ^$nume > /dev/null do sleep 30 done echo Utilizatorul $1 s-a conectat!

Comanda grep caut un ablon specificat (n cazul nostru numele utilizatorului) ntr-un fiier. Metacaracterul "^" specific faptul c ablonul se potrivete cu ieirea comenzii who doar dac este gsit la nceputul liniei (tiind faptul c who afieaz la nceputul fiecrei linii numele utilizatorilor conectai la sistem n momentul respectiv). Deoarece ieirea comenzii grep nu este folosit n nici un fel, ea este redirectat spre /dev/null. Instruciunea sleep determin oprirea temporar a execuiei programului pentru un interval de 30 de secunde; cu alte cuvinte, verificarea conectrii utilizatorului se face la intervale de 30 de secunde. Dac shell-script-ul este denumit lookout, atunci el poate fi apelat n background folosindu-se sintaxa:
$ lookout <nume_utilizator>&

iar mesajul de conectare va aprea n momentul n care utilizatorul se conecteaz la sistem i este "descoperit" de comanda lookout. 153

UNIX

Exemplul 2. Urmtorul program va afia cte un mesaj pentru toate orele zilei ntre 8 i 24:
ora=8 until [ $ora gt 24 ] do case "$ora" in [8-9] |1[0-1]) echo "Buna dimineata!" ;; 1[2-3]) echo "Ora pranzului!" ;; 1[4-6]) echo "Siesta!" ;; *) echo "Buna seara!" ;; esac ora=`expr $ora + 1` done

Execuia programului va afia pe ecran:


Buna dimineata! Buna dimineata! Buna dimineata! Buna dimineata! Ora pranzului! Ora pranzului! Siesta! Siesta! Siesta! Buna seara! Buna seara! Buna seara! Buna seara! Buna seara! Buna seara! Buna seara! Buna seara!

154

Bourne shell

7.4.4

Instruciunile break i continue

Instruciunile break i continue sunt instruciuni de salt, fiind folosite n mod asemntor cu instruciunile omonime din limbajul C. Astfel, instruciunea break determin ieirea din cel mai interior ciclu ce o conine i continund cu execuia primei comenzi dup ciclul respectiv, iar instruciunea continue determin saltul la nceputul ciclului ce o conine. Exemplu Secvena urmtoare de program citete valoarea unui an care trebuie s fie cuprins ntre 1900 i 2000 iar dac nu se introduce nici o valoare se reia introducerea anului.
valid=n until [ "$valid" = y ] do echo "Introduceti anul (n intervalul 1900-2000) i\ tastati <ENTER>" read an if [ "$an" = "" ] then continue fi if [ "$an" -lt 1900 -o "$an" -gt 2000 ] then echo "\n Anul trebuie sa fie n intervalul 1900-\ 2000" else valid=y fi done

Ce se va ntmpla n cazul n care n exemplul anterior continue este nlocuit de break? 7.5 Funcii n Shell

Ca i n limbajul C, avem posibilitatea i n Bourne Shell s folosim funcii definite de utilizator pentru a conferi modularitate programelor. De asemenea, funciile se apeleaz mai rapid dect ar fi apelate alte shell-script-uri. La apelul unui alt shell-script, shell-ul trebuie s caute pe hard disc programul i s-l deschid nainte de a fi citit, situaie n care se creeaz un nou proces; acest lucru nu se ntmpl n cazul apelului unei funcii. 155

UNIX

O funcie definit ntr-un shell-script exist doar n cadrul procesului respectiv i nu poate fi exportat. Formatul general al declarrii unei funcii este:
nume() { <secventa_de_comenzi> }

Parantezele rotunde ce urmeaz dup numele funciei specific interpretorului de comenzi c este vorba despre o funcie. Observaie: Spre deosebire de limbajul C, parantezele ce urmeaz dup numele funciei nu au niciodat coninut. Apelul funciei se face prin numele ei, ca o comand obinuit; de aceea, numele funciilor nu trebuie s coincid cu numele comenzilor UNIX sau ale comenzilor Shell. O funcie poate accesa variabilele setate pentru shell-ul curent (att cele stabilite la nceputul procesului de login ct i cele ce se modific pe parcurs). De regul, funciile se scriu la nceputul shell-script-ului; n caz contrar, codul funciei trebuie s precead apelul su. Exemplu. Fie funcia:
go() {

} go $1

cd $1 PS1="`pwd`>"

Dac numele shell-script-ului este gofunc, atunci el poate fi apelat n modul urmtor:
$ gofunc /home/serban

iar rezultatul apelului va fi schimbarea directorului curent n /home/serban i schimbarea primului prompter n "/home/serban>".

156

Bourne shell

7.6 7.6.1

Mediul Shell Apelurile fork i exec

n UNIX, apelul de sistem fork determin producerea unui nou proces. Apelul exec face ca un nou program s se suprapun peste noul proces. Dup fiecare apel fork ce genereaz un nou proces, vechiul proces se execut n continuare avnd coninutul intact. Noul proces este identic cu printele sau pn cnd exec se suprapune cu imaginea noului program. Acest eveniment apare, de regul, la execuia unei comenzi. Apelul de sistem wait suspend execuia shell-ului pn cnd noul proces este terminat. Atunci cnd apelul de sistem exec se autoapeleaz la prompter-ul shell, coninutul procesului vechi se pierde. Procesul original este suprapus cu imaginea noului program. Spre exemplu, se poate considera comanda:
$ exec ls -l

n acest caz, comanda anterioar este suprapus peste procesul shell; n momentul execuiei sale, shell-ul se termin i de aceea utilizatorul este confruntat cu prompter-ul de login. Un proces este un program n execuie, fiecare proces avnd o arie de memorie unde este stocat informaia despre acesta. Un proces aflat n execuie este descris de o tabel de procese. Tabela de procese conine informaii precum: identificatorul procesului (process id) adrese de memorie descriptori de fiiere. Aceste informaii sunt folosite de ctre kernel pentru controlul execuiei. Procesul n sine conine codul ce va fi executat, avnd, de asemenea, asociat o poriune de date n memorie ce conine informaii referitoare la mediul sistemului (variabilele de mediu). 7.6.2 Modaliti de grupare a comenzilor shell

Exist o serie de modaliti de grupare a comenzilor shell: grupare secvenial: pwd;ls -l grupare n paranteze: (pwd;ls -l) grupare n background: sort fiier& grupare n conduct (pipe): ls -l | pg 157

UNIX

n timp ce gruparea n paranteze i execuia n background produc un singur proces copil, gruparea secvenial i cea de tip pipe produc procese copil multiple. Datorit vitezei operaiunilor, utilizatorul nu realizeaz cte procese sunt generate de fiecare dat. n cazul gruprii secveniale, shell-ul genereaz un proces de execuie a primei comenzi. Cnd comanda este ncheiat, shell-ul genereaz alt proces pentru execuia celei de-a doua comenzi, deci procesele sunt generate secvenial. Gruparea n paranteze se folosete atunci cnd ieirile comenzilor sunt trimise ctre o singur destinaie. Este generat n acest caz un singur proces ce este suprapus de fiecare dat cnd trebuie executat alt comand. Gruparea n conduct se folosete atunci cnd ieirea primei comenzi trebuie preluat de a doua comand ca intrare. Comanda pipe determin generarea attor procese cte comenzi exist pe linia de comand. Comenzile sunt suprapuse peste aceste procese i sunt executate. Comunicarea dintre procesele n execuie este stabilit de un fiier special de tip pipe. Comenzile rulate n background sunt executate n mod normal, adic procesul este generat de fork i comanda este executat de exec. Totui, apelul de sistem wait este omis. Aceast lucru permite shell-ului s continue de ndat ce comanda din background a nceput. Uneori este necesar ca o comand n background s atepte pna la terminarea unei alte comenzi din background nainte ca s fie executat codul. n acest caz este folosit o combinaie de wait i $! ($! conine identificatorul procesului ultimei comenzi lansate n background). Secvena urmtoare justific aceasta:
sort sort ... wait wait hugefile > outfile1& pid1=$! hugefile > outfile2& pid2=$! $pid1 $pid2

diff outfile1 outfile2 >&1

7.6.3

Modaliti de apel al shell-ului

Exist dou modaliti de apel al shell-ului: apelul standard i apelul la linia de comand. Apelul standard se face prin intermediul procedurii de login, procedur n care se folosesc anumite fiiere i programe pentru a face iniializrile configuraiei utilizatorilor. Spre exemplu, n UNIX System V se folosesc fiierele /etc/inittab, /etc/profile, /etc/passwd i .profile. 158

Bourne shell

Dup ce numele i parola utilizatorului (preluat din /etc/passwd, unde este memorat criptat) sunt verificate, programul login folosete informaia coninut n /etc/passwd pentru urmtorul pas din procedur. Fiecrui utilizator i este asociat o linie n acest fiier ce conine numele, parola, directorul home i shell-ul implicit ce este apelat la intrarea n sistem. Dup ce au fost executate fiierele /etc/profile i .profile programul login se suprapune peste sh folosind apelul de sistem exec. O alt modalitate de apel al shell-ului este de a introduce numele la linia de comand. Comanda exec poate fi folosit la linia de comand, urmat de numele programului shell ca opiune:
$ exec -sh

Aceast comand asigur faptul c fiierele /etc/profile i .profile sunt executate. Comanda nu creaz un nou proces ci suprapune programul sh peste un proces n execuie. Deoarece const din execuia att a unui fork ct i a unui exec, comanda sh creeaz un nou proces. 7.6.4 Comanda sh

O posibilitate de folosire a acestei comenzi este aceea de a folosi opiunea -r prin intermediul creia se pornete un shell restricionat (rsh - restricted shell). Acest shell reduce posibilitile de aciune ale utilizatorului fa de aciunile permise n cadrul shell-ului obinuit (de regul comanda este folosit pentru utilizatorii noi din sistem). Aceste restricii sunt: Variabilele PATH i SHELL nu pot fi modificate; Comenzile nu pot fi specificate folosindu-se ntreaga cale; Redirectarea operatorilor este dezactivat (pentru <, >, >>); Programele nu pot fi pornite cu exec; Comanda cd este dezactivat; Cu alte cuvinte, rsh dezactiveaz toate comenzile ce nu sunt n directorul curent sau n calea standard de cutare, protejeaz fiierele de creare sau modificare prin redirectare, asigur protecia suprancrcrii shell-ului de ctre utilizator i foreaz utilizatorul s rmn n directorul home. Alte opiuni ale comenzii: Opiunea -c <sir_caractere> face s se execute comanda identificat de irul de caractere; 159

UNIX

Opiunea -i face shell-ul interactiv; Opiunea -s permite posibilitatea citirii de comenzi de la intrarea standard. 7.6.5 Subshell-uri Este important n UNIX s cunoatem modul de execuie a comenzilor i shell-script-urilor din punct de vedere al "locului" de rulare a acestora. Astfel, atunci cnd o comand este oferit spre execuie shell-ului este creat un subshell, care este un proces copil. Cea mai uzual metod de a rula o comand este aceea de a introduce comanda la prompter-ul UNIX. Totui, comanda poate fi executat i astfel:
$ sh nume_comanda

Fiecare metod creeaz de fapt cte un subshell. Ce este important de tiut este faptul c modificrile aduse mediului de ctre subshell nu sunt valabile i n shell-ul printe. 7.6.6 Comenzile env i set

Shell-ul ofer posibilitatea modificrii mediului de execuie prin: env set Atunci cnd folosim env fr argumente, se vor lista doar variabilele ce au fost motenite (exportate) de la procesul printe. Exemplu:
$ env VAR=1 EXPORTED=vt100

Atunci cnd folosim set fr argumente, se ateapt o list a tuturor variabilelor din mediul shell al utilizatorului (variabile locale sau exportate).

160

Bourne shell

Exemplu:
$set PATH=/home/razvan:/bin:/usr/bin TERM=vt220 VAR1=1 EXPORTED=vt100 $

Formatul general al comenzii env este:


$ env [-] [<nume=valoare ...>][<comanda>

Exemplu:
$ env TERM=tvi050 vi myfile

Scopul lui env este modificarea temporar a mediului shell. Atunci cnd comanda env este folosit fr semnul minus (-), preia mediul curent i l modific n concordan cu atribuirile specificate, executnd apoi comanda ce apare n mediul temporar. Dac apare semnul minus (-), mediul motenit este ignorat i se execut comanda respectiv folosind mediul specificat. Formatul general al lui set este:
$ set [optiuni] [argumente]

Atunci cnd sunt specificate valori drept argumente, sunt setate valorile parametrilor poziionali corespunztori. Atunci cnd set este folosit cu opiuni, ea modific execuia shell-ului curent. Opiunile sunt activate dac sunt precedate de semnul minus (-) i dezactivate cnd sunt precedate de semnul plus (+). Una dintre utilizrile de baz ale comenzii set este aceea de depanare a shell-script-urilor folosind opiunea -v care urmrete execuia shell-script-ului. Opiunile existente pentru comanda set sunt: -a export n mod automat toate variabilele ce sunt definite sau modificate; -e iese dac o comand returneaz un exit-status false; -f dezactiveaz generarea numelui de fiier; -n citete comenzile fr s le execute;

161

UNIX

-u genereaz o eroare dac o variabil este referit nainte de a fi definit; -v tiprete fiecare linie de comand shell nainte de a fi folosit; -x tiprete comenzile i argumentele lor atunci cnd sunt folosite; - dezactiveaz opiunile x i v. Fie shell-script-ul denumit test:
set -x cmd=wc cat fisier | $cmd -l

Execuia shell-script-ului este:


$ + cat fiier + wc -l 33 $

Un shell-script poate stabili care dintre opiunile set sunt activate folosind variabila special $-. Semnificaia semnalelor recunoscute n UNIX
Tabelul 7.1
Numrul semnalului 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Semnal Semnificaie semnal special shell ce determin execuia unei comenzi la ieirea din shell terminal hangup ntrerupere (DEL - tast apsat) quit (s-a apsat CTRL+\) instruciune ilegal trace/breakpoint trap abort emulation trap excepie aritmetic semnal kill eroare bus segmentation fault bad system call broken pipe alarm clock terminated

SIGHUP SIGINT SIGQUIT SIGILL SIGTRAP SIGABORT SIGEMT SIGFPE SIGKILL SIGBUS SIGSEGV SIGSYS SIGPIPE SIGALARM SIGTERM

162

Bourne shell

7.6.7

Semnale

Este necesar uneori ca shell-script-ul s poat fi ntrerupt pentru a ne ntoarce la prompter. Putem apsa DELETE, BREAK sau CTRL+C. n funcie de necesiti, uneori este necesar s executm o operaie de ntreinere atunci cnd un shell-script este ntrerupt (trebuie s nchidem sau s tergem fiierele temporare). n alte circumstane, se poate dori ndeplinirea unei anumite sarcini fr ntrerupere. UNIX ofer posibilitatea manevrrii exprese a evenimentelor iniiate de lumea din afar prin folosirea semnalelor. n funcie de versiunea de UNIX utilizat, numrul de semnale recunoscute variaz ntre 15 i 30. Lista acestora este prezentat n tabelul 7.1. Semnalele 1..9 i 15 sunt relevante pentru programatorul Shell. Celelalte apar pentru completitudine i pentru a arta ce fel de semnale pot fi manipulate de UNIX. Observaie. De regul, semnalele sunt interceptate de apelul de sistem signal ce poate fi folosit n programe C. Exemplu: Fie o instruciune dintr-un program C ce face o mprire la zero: printf("Impartire la zero:%d",6/0); n acest caz este semnalat un SIGFPE, iar programul trebuie s includ cod care s recepioneze acest semnal: signal(SIGFPE,f_cleanup), unde f_cleanup este funcia ce rezolv problema i afieaz un mesaj corespunztor. Comanda trap O alt modalitate de interceptare a mesajelor este aceea realizat prin intermediul comenzii interne trap. Aceast comand permite interceptarea i prelucrarea semnalelor ce ar afecta shell-script-ul ntr-o manier imprevizibil. Formatul general al comenzii este:
$ trap comenzi semnale

unde comenzi reprezint comenzi ce se execut la apariia unuia dintre semnale. Fie comanda:
$ trap "rm tmp*;echo interrupt!;exit 3" 1 2

163

UNIX

Aceast comand poate inhiba ntreruperile n cazul proiectrii unor interfee prietenoase cu utilizatorii. De exemplu, o interfa utilizator poate s ignore apsarea tastelor DEL, BREAK sau CTRL+C. Urmtoarea comand face ca semnalele respective s fie ignorate:
$ trap "" 1 2 3 15

Atunci cnd trap este folosit pentru a ignora semnale, afecteaz toate subshell-urile. Cnd trap este folosit s ia aciune, nu le afecteaz. Dac se dorete ca aciunea lui trap s aib efect n subshell-uri, trebuie specificat n mod explicit acest lucru n fiecare subshell. Totui, nu orice semnale pot fi ignorate; n caz contrar nu ar mai putea fi intrerupte anumite programe sub nici o form! Exist SIGKILL care nu poate fi ignorat! Acest semnal este generat de comanda intern kill. Exemplu:
$ kill -9 12345

unde 12345 este identificatorul procesului ce trebuie terminat. 7.7 7.7.1 Comenzi interne Introducere

Comenzile nglobate sau interne (built-in commands) sunt comenzi ce pot fi apelate din interiorul unui shell-script sau de la linia de comand. Shell-ul are 32 de comenzi nglobate. Fiecare comand ce este executat returneaz un cod de ieire denumit exit-code sau exit-status. Atunci cnd comanda nu se termin pe o singur linie, shell-ul prezint cel de-al doilea prompter (al doilea prompter este implicit semnul mai mare (>)) utilizatorului pentru introducerea caracterelor de continuare pn cnd se ncheie comanda.

164

Bourne shell

Exemplu:
$ for i in f1 f2 >do >file $i >done $

7.7.2

getopts

Exist posibilitatea ca un shell-script s fie apelat cu opiuni. Dac un shell-script denumit test.cmd are urmtoarea sintax:
$ test.cmd [-a] [-b] [-c]

atunci el poate fi apelat n oricare dintre modalitile urmtoare:


$ $ $ $ $ test.cmd test.cmd test.cmd test.cmd test.cmd -a -abc -a -b -a -b -c

.a.m.d n acest caz vom folosi getopts n interiorul uneia dintre instruciunile for, while sau until. Comanda getopts returneaz valoarea logic "true" att timp ct exist opiuni ce trebuie luate n considerare. Formatul general al comenzii este:
$ getopts optiuni nume_variabila

165

UNIX

Exemplu. Fie shell-script-ul test.cmd:


# test.cmd ... while getopts abc optiune do ... done

Care este modalitatea de lucru a lui getopts? Spre exemplu, dac apelul s-a fcut test.cmd -abc, comanda getopts verific prima dat dac exist simbolul minus (-) n linia de comand. Verific apoi dac litera ce urmeaz este una dintre opiunile valide. Dac opiunea este valid, atunci ea este memorat n variabila optiune. n acest moment este returnat un exit status cu valoarea zero, deci corpul ciclului while este executat. Opiunile urmtoare sunt tratate n mod asemntor. Atunci cnd se epuizeaz toate opiunile, getopts returneaz o valoare diferit de zero i astfel ciclul while se ncheie. n cazul apariiei unei opiuni invalide, spre exemplu se face apelul test.cmd -abcd, opiunile corecte sunt tratate ca mai sus, iar opiunea invalid d este considerat i ea de getopts deoarece face parte din grupul precedat de semnul minus (-). n acest caz, getopts ia valoarea special ?, apoi returneaz un exit status de valoare zero i corpul ciclului while este executat. Shell-script-ul va conine cod corespunztor pentru fiecare opiune valid. Un exemplu ar putea fi acela construit cu un case:
while getopts abc optiune do case $optiune in a) ...;; b) ...;; c) ...;; \?) echo "Optiune invalida..." esac done

166

Bourne shell

Fie un nou shell-script, cu urmtorul format:


$ test2.cmd [-a] [-b] [-c] infocib

Opiunile a,b i c sunt tratate ca mai nainte iar getopts ntoarce o valoare diferit de zero deoarece argumentul infocib nu este o opiune. Ciclul se termin drept rezultat al apariiei unei valori false (diferit de zero) iar argumentul infocib este luat n considerare n continuare, dup ciclul getopts. Fie acum cazul n care o opiune necesit i un argument ce trebuie specificat. Fie shell-script-ul:
$ test3.cmd [-a] [-b argument] nume_fisier

Comanda getopts devine: getopts ab: opiune, unde apariia semnului dou puncte (:) nseamn c aceast opiune trebuie urmat de cel puin un caracter whitespace i de un argument. Argumentul va fi memorat ntr-o variabil special numit OPTARG. Dac linia de comand conine -b fr nici un argument n continuare, n variabila opiune este memorat un semn de ntrebare (?). O alt variabil special, numit OPTIND este incrementat de fiecare dat cnd getopts returneaz o valoare. Ea are iniial valoarea 1. Se poate verifica n acest mod dac a fost introdus argumentul specificat pentru execuia corect a comenzii. Astfel, n apelul test3.cmd -a -b nume infocib, dac valoarea lui OPTIND este mai mare dect valoarea lui $#, atunci numele fiierului nume_fisier pentru execuia corect a scriptului nu a fost introdus. 7.7.3 Comanda hash

Comanda hash este folosit pentru mrirea vitezei primirii comenzilor. Sintaxa general a acestei comenzi este:
$ hash [-r] comenzi

167

UNIX

Acest apel al comenzii "spune" shell-ului s caute comanda sau comenzile specificate i s adauge directorul n care sunt localizate acestea la "lista hash". Spre exemplu, odat executat comanda:
$ hash inter

urmtoarele apeluri ctre shell-script-ul inter se vor executa cu vitez mai mare. Dac folosim comanda hash fr nici un argument, se va afia o list cu comenzi ce sunt deja n lista hash. Opiunea -r se folosete atunci cnd dorim tergerea din list a unei comenzi. Comanda hash -r terge toate componentele listei. Comanda hash fr nici un argument afieaz toate componentele listei. 7.7.4 Comanda type

Comanda type afieaz informaii despre comanda sau comenzile specificate, avnd sintaxa:
$ type comenzi

Comanda type poate fi folosit mpreun cu: comenzi interne comenzi UNIX shell-script-uri funcii 7.7.5 Comanda newgrp

Comanda newgrp modific pentru un utilizator UNIX identificatorul de grup (group_id). Sintaxa general este:
$ newgrp [nume_grup]

Presupunnd c grupul utilizatorului se intituleaz cibernetica i trebuie schimbat n comert, comanda este: newgrp comert. Pentru motive legate de securitatea sistemului, modificarea este permis doar dac utilizatorul apare n lista membrilor grupului comert din 168

Bourne shell

fiierul /etc/group. Cu ajutorul acestei modificri, utilizatorul poate accesa programe disponibile grupului comert. 7.7.6 ulimit

Dimensiunea fiierului pe care un proces copil l poate scrie este limitat de un anumit numr de blocuri folosind comanda ulimit. Sintaxa general a acestei comenzi este:
$ ulimit dimensiune_fisier

Pentru a afla setarea curent, introducem pur i simplu comanda fr nici un argument. Utilizatorul obinuit poate micora dimensiunea; doar root poate crete aceast dimensiune. 7.7.7 umask

Comanda umask determin drepturile de acces implicite la fiiere (default mask). Acestea sunt create folosind valori octale. Pentru un fiier obinuit, drepturile de acces deplin sunt de forma: -rw-rw-rw-, iar valoarea octal a reprezentrii este 666. Dreptul de acces pentru un anumit fiier se obine scznd din 666 valoarea lui umask. n general, valoarea lui umask este setat de root la valoarea octal 022. Se obine astfel valoarea 666-022=644, care reprezint drepturile implicite pentru fiierele nou create: -rw-r--r--. Dac dorim drepturi depline de acces, vom seta umask la valoarea 0, prin comanda umask 0. Pentru un director, drepturile depline de acces sunt: -rwxrwxrwx (777 n octal). Dreptul x (de execuie) pentru un director ofer utilizatorului dreptul de citire a coninutului directorului. Astfel, dreptul de acces la director se obine scznd din 777 valoarea lui umask: 777-022=755, care reprezint drepturile: -rw-r-xr-x. 7.7.8 Comanda times

Comanda times se folosete pentru afiarea de ctre shell a timpului necesitat de toate procesele rulate de ctre acesta. Sunt listate att timpul utilizator ct i cel sistem. Fie exemplul:
$ times
0m30s 3m30s

169

UNIX

Primul timp reprezint 30 de secunde petrecute n mod utilizator iar cel de-al doilea timp este timpul ce a fost alocat proceselor sistem. 7.7.9 Comanda eval

Comanda eval asigur evaluarea complet a unei variabile. Exemplu:


$ dir_curent=$pwd $ echo $dir_curent $ pwd

n cazul utilizrii comenzii eval vom obine urmtorul rezultat:


$ eval $dir_curent /home/stud/an3/i97aaa

7.8

Crearea unui shell-script

Pentru a crea un shell-script avem nevoie de un editor de text cu care putem insera comenzi shell ntr-un fiier. Este bine s introducem n cadrul script-ului pe lng comenzile folosite i comentarii, pentru a face neles rolul comenzilor i scopul shell-script-ului. Comentariile se introduc folosindu-se simbolul special diez (#). Tot ce urmeaz dup simbolul # pn la captul rndului pe care se gsete acesta este considerat comentariu. Excepie face prima linie din program, care indic tipul programului shell ce va executa liniile din script (sh, csh, bash etc.). Astfel, n cazul utilizrii shell-ului Bourne, prima linie din script va fi:
#!/bin/sh

Aici semnul special # nu mai are rolul de nceput de comentariu, ci mpreun cu semnul exclamrii (!) formeaz un numr magic - #! - ce specific kernel-ului s identifice programul ce va interpreta shell-script-ul respectiv. Aceast linie trebuie neaprat s se afle la nceputul programului

170

Bourne shell

(pe prima linie din script). n cazul folosirii shell-ului Bash din Linux, prima linie dintr-un shell-script va arta astfel:
#!/bin/bash

Dup ce am creat fiierul shell-script ce poate conine comenzi shell, comenzi UNIX sau comentarii, trebuie s facem acest fiier executabil. Acest lucru se realizeaz folosind comanda UNIX chmod. Spre exemplu, dac shell-script-ul nostru se intituleaz program_shell, atunci comanda prin care acest fiier devine executabil este:
$ chmod +x program_shell

7.9

Depanarea programelor shell

Utilizarea opiunii n la apelul comenzii sh ne ofer posibilitatea verificrii sintaxei unui shell-script fr a executa vreuna din comenzile acestuia. Dac exist vreo eroare de sintax n cadrul script-ului, shell-ul va semnaliza acea eroare. n caz contrar, nseamn c programul este corect din punct de vedere sintactic i nu se va afia nimic. Opiuni de depanare pentru Bourne Shell
Tabelul 7.2
Denumirea opiunii Opiunea echo Comanda sh x nume_script Explicaii Afieaz fiecare linie a script-ului dup substituirea variabilelor, naintea execuiei Afieaz fiecare linie a script-ului naintea execuiei, exact aa cum a fost scris Interpreteaz dar nu execut comenzile Urmrete execuia unui script Oprete urmrirea execuiei unui script

Opiunea verbose Opiunea noexec Seteaz echo-ul Reseteaz echo-ul

sh v nume_script sh n nume_script set x set +x

Cel mai des se folosete opiunea x a comenzii set pentru depanarea script-urilor, sau se poate apela direct comanda sh cu opiunea x. Utiliznd aceast opiune, se va afia fiecare comand din shell-script (dup ce s-a 171

UNIX

fcut n prealabil substituirea valorilor variabilelor) i apoi este executat. Atunci cnd se afieaz o linie din shell-script, este precedat de semnul plus (+). O alt opiune folosit este opiunea v (verbose) vorbrea (sh v nume_script) cnd se afieaz fiecare linie din shell-script ca i cum ar fi fost scris la linia de comand iar dup aceea este executat. n tabelul 7.2 sunt prezentate opiunile folosite pentru depanare n cazul shell-ului Bourne. 7.10 Exemple de programe Bourne shell Exemplul 1.
iesire=F while [ $iesire = "F" -o $iesire = "f" ] do clear echo "Alegeti o opiune:" echo echo "1. Lansare Midnight Commander" echo "2. Editare cu Nice Editor" echo "3. Afisare cale curenta" echo "4. E-mail" echo "5. Afisarea numarului de utilizatori conectati la\ sistem" echo "0. Iesire" echo read optiune case $optiune in 1) mc ;; 2) echo "Nume fiier de editat: " read fis if [ -f $fis ] then ne $fis else echo "Fiier inexistent. Il\ creati?(d/n)" read rasp if [ $rasp = "d" ] then ne $fis fi fi ;; 3) pwd echo "Apasati o tasta pentru continuare..." read y ;;

172

Bourne shell 4) echo "Introduceti adresa destinatarului:" read adresa mail $adresa echo "Apasati o tasta pentru continuare..." read y ;; 5) echo "Sunt conectati `who | wc -l`\ utilizatori in acest moment!" echo "Apasati o tasta pentru continuare..." read y ;; 0) iesire=D ;; esac done

Explicaii. Programul afieaz un meniu cu 6 opiuni. Opiunea este citit n variabila optiune i n funcie de valoarea acesteia se execut comenzile specificate folosindu-se o instruciune case. Totul este inclus ntr-un ciclu while, care se va repeta pn n momentul selectrii opiunii 0, cnd variabila iesire ia valoarea D i se iese astfel din ciclul while. Exemplul 2. n acest exemplu vom lucra cu o baz de date simpl vom crea funcii pentru adugare, tergere, actualizare i un program principal ce apeleaz aceste funcii. Baza noastr de date va conine informaii despre studenii unei faculti: nume i prenume, grupa, adresa, i data naterii. Fiierul ce va conine aceste informaii se va numi studenti. S presupunem c vom defini funciile n fiierul functii. Fie funcia de adugare:
adaug () { # Functia este definita in fisierul functii while true do echo "Adaugare de informatii " echo "Introduceti numele si prenumele studentului " read nume echo "Introduceti grupa " read grupa echo "Introduceti adresa " read adresa echo "Introduceti data nasterii (zz/ll/aaaa) " read datan echo $nume:$grupa:$adresa: $datan

173

UNIX echo "Datele sunt corecte? " read ans case "$ans" in [Dd]*) echo "Adaugarea informatiilor..." echo $nume:$grupa:$adresa: $datan >> studenti sort -u studenti -o studenti echo "Vreti sa continuati introducerea? " read ans if [ $ans = D -o $ans = d ] then return # revenire in programul apelant else continue # salt la inceputul ciclului fi ;; *) echo "Incercati din nou?(D/N) " read answer case "$answer" in [Dd]*) continue;; *) exit;; esac ;; esac done # Sfarsitul definitiei functiei

Programul principal ce va apela funciile de adugare, tergere, actualizare va arta astfel:


#!/bin/sh # Numele script-ului: program # Acest shell-script va apela functiile #fisier=$HOME/studenti fisier=./studenti .functii # Comanda punct citete fis functii n memorie if [ ! -f $fisier ] then echo "`basename $fisier` nu exista" 1>&2 exit 1 fi echo "Selectati optiunea: "

174

Bourne shell cat <<EOF [1] Adaugare de informatii [2] Stergere de informatii [3] Actualizarea informatiilor [4] Iesire din program EOF read optiune case $optiune in 1) adaug # Apelul functiei adaug ;; 2) sterg # Apelul functiei sterg ;; 3) actualizare # Apelul functiei actualizare ;; 4) echo La revedere! exit 0 ;; *) echo Optiune gresita! exit 2 ;; esac echo Intoarcere din apelul functiei

Funciile de tergere i de actualizare se las ca tem.

175

1. Bourne Again Shell

BOURNE AGAIN SHELL

8.1 Introducere Bourne Again Shell (bash) ofer o serie de faciliti n plus fa de shell-ul standard Bourne, att la nivel de interpretor al liniei de comand, ct i la nivel de limbaj de programare. Printre altele, bash ofer istoric al comenzilor, alias-uri, auto-completarea comenzilor i a numelor de fiiere, editarea liniei de comand, etc. Unele dintre aceste faciliti sunt prezente i n shell-ul standard Bourne, ns proiectul GNU a extins shell-ul pentru a include un numr de noi faciliti i pentru compatibilitate POSIX. O dat cu realizarea variantei bash 2.x, au fost adugate att de multe funcionaliti (unele din Korn shell i C shell), nct shell-ul bash reprezint un shell complect funcional att la nivel de interpretor ct i la nivel de limbaj de programare. Shell-ul bash s-a nscut pe 10 ianuarie 1988 sub oblduirea lui Brian Fox i a fost adoptat mai trziu de ctre Chet Ramey. Prima versiune a fost versiunea bash 0.99, iar cele mai importante mbuntiri au fost aduse odat cu versiunea 2.0. Toate versiunile sunt disponibile free sub licen public GNU. Pentru a vedea ce versiune de bash folosete, un utilizator poate folosi comanda bash --version sau poate afia valoarea variabilei de mediu BASH_VERSION. Urmtorul exemplu ne nfieaz o posibil situaie:
$ bash --version GNU bash, version 2.04.11(1)-release (i386-redhat-linux-gnu) Copyright 1999 Free Software Foundation, Inc. $ echo $BASH_VERSION 2.04.11(1)-release

176

UNIX

8.2 Iniializare i mediu n momentul iniializrii, shell-ul bash parcurge o serie de pai. Primul proces ce se ruleaz n momentul iniializrii este init, cu identificatorul PID=1. Acest proces iniiaz un proces getty, care deschide porturile terminalului, oferind un spaiu de manevr pentru standard input i pentru standard output i standard error. n urma acestui proces va fi afiat un prompter de login pe ecran. n continuare se execut programul /bin/login, care cere o parol, cripteaz i verific parola, setnd un mediu iniial de lucru i pornind shell-ul de login (care n cazul nostru este /bin/bash). Dup aceea, procesul (programul) bash caut fiierul de configurare /etc/profile i execut comenzile din acesta. n continuare, se caut n directorul home un fiier de configurare iniial denumit .bash_profile. Dup executarea comenzilor din acest fiier, se va executa o comand din fiierul ENV al utilizatorului, de regul .bashrc i, n cele din urm, prompter-ul (semnul $ pentru utilizatorul obinuit sau # pentru root) este afiat pe ecran, ateptnd introducerea de comenzi. Dac dorim modificarea shell-ului la linia de comand, putem s introducem simplu numele shell-ului i s apsm ENTER. De exemplu, dac folosim la un moment dat shell-ul standard Bourne i dorim s schimbm n Bourne Again shell, nu avem dect s introducem bash la linia de comand, urmat de tasta ENTER:
$ ps PID TTY TIME CMD 5549 tty1 00:00:00 sh 5429 tty1 00:00:00 ps $ bash bash-2.04$ bash-2.04$ ps PID TTY TIME 5449 tty1 00:00:00 5465 tty1 00:00:00 5472 tty1 00:00:00

CMD sh bash ps

Explicaii. Iniial, comanda ps (process status) ne arat procesele aflate n execuie. Se observ c ruleaz shell-ul Bourne (sh). Se introduce apoi comanda bash la prompter i apare un nou prompter (bash-2.04$).

177

Bourne again shell

Introducnd din nou comanda ps, se afieaz de data aceasta dou shell-uri care ruleaz: shell-ul iniial sh i shell-ul bash pornit ulterior. Fiiere de iniializare Shell-ul bash are o serie de fiiere de configurare pe care le verific la pornire. Aceste fiiere de configurare sau iniializare sunt procesate (rulate) n funcie de mai multi factori (dac shell-ul curent este i shell-ul de login, dac este un alt shell interactiv diferit dect cel de login, sau un shell non-interactiv - shell-script). S vedem n continuare care sunt fiierele de configurare iniial i ordinea n care aceste fiiere sunt procesate. n momentul login-ului, nainte de apariia prompter-ului shell, este executat fiierul de configurare global, /etc/profile. Dup aceea, dac exist, este procesat fiierul .bash_profile din directorul home al utilizatorului. Acest fiier specific alias-uri i funcii i seteaz variabile de mediu specifice utilizatorului sau pornete anumite shell-script-uri. Dac fiierul .bash_profile nu exist, dar exist fiierul .bash_login, atunci acest fiier va fi procesat, iar dac acesta din urm nu exist, va fi procesat fiierul .profile (din directorul home al utilizatorului).

8.2.1 Fiierul /etc/profile Fiierul /etc/profile reprezint un fiier de configurare global a ntregului sistem. Acest fiier este editat de ctre administratorul sistemului pentru a executa anumite comenzi atunci cnd se iniializeaz sistemul. El este executat atunci cnd pornete shell-ul bash. El are acelai efect i n cazul shell-urilor Korn i Bourne i, de regul, ndeplinete anumite sarcini precum rularea programului ce administreaz mailul (mail spooler) sau afiarea unui mesaj iniial, denumit mesajul zilei (message of the day, din fiierul /etc/motd). n continuare este prezentat un exemplu de fiier /etc/profile (nu am numerotat liniile goale):
1 #/etc/profile 2 # System wide environment and startup programs 3 # Functions and aliases go in /etc/bashrc 4 PATH=$PATH:/usr/X11R6/bin 5 ulimit -S -c 1000000 > /dev/null 2>&1 6 if [ id -gn = id -un -a id -u -gt 14 ]; then 7 umask 002 8 else

178

UNIX 9 10 11 12 13 14 15 umask 022 fi USER=id -un LOGNAME=$USER MAIL=/var/spool/mail/$USER HOSTNAME=`/bin/hostname` HISTSIZE=1000

16 if [ -z $INPUTRC -a ! -f $HOME/.inputrc ]; then 17 INPUTRC=/etc/inputrc 18 fi 19 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC 20 for i in /etc/profile.d/*.sh ; do 21 if [ -x $i ]; then 22 . $i 23 fi 24 done 25 unset i

Prezentm n continuare cteva explicaii analiznd fiierul /etc/profile pe linii: Liniile 1,2,3 - Comentarii n shell-script; Linia 4 - Variabilei PATH i se atribuie directoarele unde va cuta shell-ul comenzile introduse; Linia 5 - Comanda ulimit stabilete limita maxim a dimensiunii fiierelor core la 1.000.000 bytes. Fiierele core sunt fiiere create n urma opririi anormale a programelor i pot ocupa dimensiuni considerabile din spaiul de pe disc; Liniile 6-10 - Comanda if care realizeaz urmtoarele: dac numele grupului este egal cu numele utilizatorului i numrul ID al utilizatorului este mai mare dect 14, atunci seteaz umask cu valoarea 002. n acest caz, atunci cnd sunt create directoarele vor avea drepturi de acces 775 iar fiierele vor avea 664. Altfel, umask va avea valoarea 022, de unde rezult drepturi 755 pentru directoare i 644 pentru fiiere. Linia 11 - Variabilei USER i se atribuie valoarea pe care o returneaz comanda id -un (numele utilizatorului) Linia 12 - Variabilei LOGNAME i se atribuie valoarea din $USER; Linia 13 - Variabila MAIL ia valoarea egal cu numele directorului unde se programul de administare a mail-ului va salva mail-ul; Linia 14 - Variabila HOSTNAME ia valoarea numelui mainii; Linia 15 - Variabila HISTSIZE ia valoarea 1000 (numrul de comenzi stocate n memoria history);

179

Bourne again shell

Liniile 16-18 - Comanda if care verific dac fiierul cu numele dat de variabila INPUTRC are dimensiunea diferit de zero i nu exist fiierul .inputrc din directorul home i n acest caz variabila INPUTRC ia valoarea /etc/inputrc; Linia 19 - Variabilele ce apar n aceast linie sunt exportate pentru a fi disponibile n sub-shell-uri i procese copil; Linia 20-24 - O comanda for i una if care realizeaz urmtoarele: pentru fiecare fiier cu extensia .sh din directorul /etc/profile.d, se verific dac este executabil, iar dac este executabil, se execut fiierul utilizndu-se comanda dot (.). Fiierele din directorul /etc/profile.d, lang.sh i mc.sh, seteaz setul de caractere i de fonturi i creaz o funcie denumit mc (Midnight Commander) care reprezint un browser (asemntor cu vestitul Norton Commander pentru DOS/Windows) vizual de fiiere. Pentru pornirea acestuia se scrie mc la linia de comand. Linia 25 - Variabila i este resetat prin comanda unset, adic tears din memoria shell-ului. 8.2.2 Fiierul .bash_profile Dac fiierul .bash_profile este gsit n directorul home al utilizatorului, atunci este executat imediat dup /etc/profile. Dac .bash_profile nu exist, atunci shell-ul bash va cuta fiierul .bash_login sau, dac nici acesta nu exist, fiierul .profile, toate din directorul home. Doar unul dintre cele trei fiiere menionate anterior va fi executat, iar cutarea se face n ordinea specificat (bash_profile, .bash_login, .profile). De asemenea, bash va verifica existena fiierului .bashrc i l va executa comenzile din acesta dac fiierul exist. Prezentm n continuare un exemplu de fiier .bash_profile:
1 #.bash_profile 2 # Get the aliases and functions 3 if [ -f ~/.bashrc ]; then 4 . ~/.bashrc 5 fi 6 PATH=$PATH:$HOME/bin 7 BASH_ENV=$HOME/.bashrc 8 USERNAME=razvan 9 export USERNAME BASH_ENV PATH 10 mesg n

180

UNIX

Prezentm n continuare cteva explicaii analiznd fiierul .bash_profile pe linii: Liniile 1,2 - Comentarii n shell-script; Liniile 3-5 - Comand if care verific dac fiierul .bashrc se afl n directorul home i dac exist l ruleaz; Linia 6 - Variabilei PATH i se adaug o cale ctre subdirectorul bin din directorul home; Linia 7 - Variabilei BASH_ENV i se atribuie valoarea specificat (calea ctre fiierul .bashrc). Fiierul .bashrc conine funcii i alias-uri definite de utilizator; Linia 8 - Variabila USERNAME ia valoarea razvan; Linia 9 -Variabilele specificate sunt exportate pentru a fi valabile n subshell-uri i procese copil; Linia 10 - Comanda mesg executat cu opiunea n are ca efect blocarea mesajelor primite cu comanda write de la ali utilizatori.

8.2.3 Fiierul .bashrc Fiierul .bashrc este automat executat ori de cte ori un shell bash pornete, coninnd numai setri valabile pentru shell-ul bash. Avem n continuare un exemplu de fiier .bashrc:
1 #.bashrc 2 # User specific aliases and functions 3 # Source global definitions 4 if [ -f /etc/bashrc ]; then 5 . /etc/bashrc 6 fi 7 set -o noclobber 8 alias mv=mv -i 9 alias dir=ls -al 10 function cd { builtin cd $1; echo $PWD; }

Explicaii: Liniile 1,2,3 - Comentarii n shell-script; Liniile 4-6 - Comand if care verific existena fiierului /etc/bashrc i n acest caz l ruleaz; Linia 7 - Comanda set apelat cu opiunea noclobber determin apariia unor mesaje preventive n cazul suprascrierii fiierelor deja existente;

181

Bourne again shell

Linia 8 - Se declar un alias pentru comanda mv, astfel nct de acum ncolo ea va fi apelat automat cu opiunea -i(interactive); Linia 9 - Se declar un alias pe nume dir, care va efectul apelului comenzii ls -al; Linia 10 - Se definete o funcie utilizator. Cnd utilizatorul va schimba directorul curent se va afia i directorul curent de lucru. Numele fucniei este cd i conine comanda intern cd (change directory). Comanda intern builtin precede numele comenzii cd pentru a preveni intrarea n recursivitate infinit a funciei. 8.2.4 Fiierul .profile Fiierul .profile este un fiier de configurare definit de utilizator. El se gsete n directorul home al utilizatorului i este executat imediat dac shell-ul de login este shell-ul Bourne. n cazul n care shell-ul de login este bash, fiierul .profile va fi rulat doar dac nici unul din fiierele enumerate anterior nu exist. Fiierul conine de regul setri ale mediului i ale terminalului sau alte setri legate de diverse aplicaii, dac acestea sunt necesare. Avem n continuare un exemplu de fiier .profile:
1 2 3 4 #.profile # Fisier de configurare initiala ce se executa atunci cand # se utilizeaza shell-ul sh sau nu exista fisierele # .bash_profile sau .bash_login

5 HOSTNAME=`uname -n` 6 EDITOR=/bin/vi 7 PATH=/bin:/usr/bin:/usr/ucb:/usr/local:/usr/bin:. 8 PS1=$HOSTNAME $> 9 export TERM HOSTNAME EDITOR PATH PS1 10 stty erase ^h 11 clear

Explicaii: Liniile 1-4 - Comentarii n shell-script; Linia 5 - Variabila HOSTNAME va lua valoarea returnat de comanda uname -n; Linia 6 - Variabila EDITOR ia valoarea /bin/vi. Programe precum mail i history vor folosi acest editor; Linia 7 - Variabila PATH este setat; Linia 8 - Prompter-ului primar i este atribuit valoarea lui HOSTNAME (numele mainii), urmat de semnul $ i semnul >;

182

UNIX

Linia 9 - Sunt exportate variabilele specificate, pentru a fi valabile n subshell-uri i procese copil; Linia 10 - Comanda stty seteaz caracteristicile terminalului. Tasta Erase este setat cu valoarea ^h, astfel nct cnd vom apsa tasta Backspace, litera de dinaintea cursorului va fi tears; Linia 11 - Comanda clear terge coninutul ecranului. 8.3 Programarea n bash Scrierea unui shell-script n bash este similar cu operaia n Bourne Shell. Un shell-script se scrie cu ajutorul unui editor i conine comenzi UNIX, comentarii i cuvinte cheie de programare shell. Deoarece utilizm shell-ul bash, prima linie din shell-script va fi:
#!/bin/bash

De asemenea, script-ul trebuie s fie executabil, de aceea vom folosi comanda chmod pentru a l face executabil. n exemplul urmtor presupunem c script-ul se numete script01:
$ chmod +x script01 $ ls -lF script01 -rwxr-xr-x 1 razvan

12 Aug 12:00

script01*

8.3.1 Citirea variabilelor Citirea variabilelor se face ca i n shell-ul clasic cu comanda read. Comanda read preia caractere de la tastatura pn cnd se ntlnete un caracter newline. Caracterul (newline) de sfrit de linie este transformat ntr-un octet null atunci cnd este citit. Dac nu se specific nici un nume pentru variabil, linia citit este atribuit unei variabile interne, numit REPLY. Putem, de asemenea, folosi comanda read pentru a face un program s se opreasc n momentul n care apsm tasta ENTER. Opiunile comenzii read sunt prezentate n tabelul 8.1. De exemplu, opiunea -r este folosit pentru ignorarea perechii backslash/newline, astfel nct caracterul special backslash este considerat ca parte din linie.

183

Bourne again shell

Opiunile comenzii read


Tabelul 8.1
Comanda read raspuns read r1 r2 read read -a nume_vector read -e read -p prompter read -r linie Semnificaie Se citete de la tastatur n variabila raspuns Se citete de la tastatur n variabila r1 pn la primul caracter whitespace sau Enter, apoi n variabila r2 Se citete n variabila intern REPLY Se citete o list de cuvinte ntr-un vector denumit nume_vector Se folosete n shell-ul interactiv Afieaz un prompter, ateapt input-ul i stocheaz rezultatul n variabila REPLY Permite introducerea liniilor ce conin un backslash

8.3.2 Operaii aritmetice Variabilele pot fi declarate ca numere ntregi cu ajutorul comenzii declare -i. O variabil numar poate fi declarat astfel:
$ declare -i numar

Se pot face operaiile aritmetice uzuale cu variabilele declarate ntregi, folosind operatorii pentru adunare, scdere, nmulire, mprire i mprire modulo. Exemple:
$ declare -i numar $ numar=3+7 $ echo $numar 10 $ numar= 6 + 9 bash: +: command not found (caracterele whitespace trebuie incadrate ghilimele, corect este: numar=6 + 9) $ numar=4*5 $ echo $numar 20

de

184

UNIX

Comanda declare -i fr nici un argument va lista toate variabilele ntregi definite, precum i valorile lor, ca n exemplul urmtor:
$ declare -i declare -ir EUID=0 declare -ir PPID=846 declare -ir UID=0 declare -i numar=20 $

Se pot utiliza numere reprezentate n baze de numeraie diferite, de la baza 2 la baza 36. Formatul general de reprezentare ntr-o anumit baz este:
variabila=baza#numarul_in_acea_baza

Spre exemplu, dac: nr=2#110, atunci avem numrul 110 reprezentat n baza 2. Se pot declara numere octale (n baza 8) dac valoarea numeric a acestora este precedat de un 0 (zero). De exemplu, dac avem comanda: declare -i nr=020, atunci variabila nr are valoarea zecimal 16. Comanda let Comanda let este o comand intern bash utilizat pentru a realiza operaii aritmetice cu ntregi i a testa expresii numerice. Operatorii care sunt acceptai de comanda let pot fi vizualizai cu ajutorul comenzii: help let. Numere reale Shell-ul bash ofer suport doar pentru operaii cu numere ntregi; dac avem de fcut calcule cu numere reale, putem folosi utilitarele bc, awk sau nawk. Exemple:
$ nr=`echo scale=2; 12 / 5 | bc` $ echo $nr 2.40 $ p=`gawk -v x=2.2 -v y=3.3 BEGIN{printf %.2f\n,x*y}` $ echo $p 7.26

185

Bourne again shell

8.3.3 Parametri poziionali i comanda set Parametrii poziionali sunt aceeai cu cei din Bourne Shell: $0 este numele script-ului, $1-$9 reprezint valorile parametrilor poziionali iar $* listeaz toi parametrii poziionali. Dac numrul parametrilor poziionali era restrns la 9 pentru shell-ul Bourne, n bash putem folosi ci parametri poziionali dorim. Pentru valori mai mari dect 9, ei vor fi referii astfel: ${10}, ${11}, etc. $* semnific extinderea la un singur argument, de genul: $1 $2 $3, iar $@ are semnificaia: $1 $2 $3. Considerm urmtorul exemplu:
#!/bin/bash #Numele script-ului este test echo Numele script-ului este $0 echo Primul parametru pozitional este $1 echo Al doilea parametru pozitional este $2 echo Al 10-lea parametru pozitional este ${10}

Apelat astfel:
$./test 1 2 3 4 5 6 7 8 9 10 11

vom obine listing-ul:


Numele script-ului este ./test Primul parametru pozitional este 1 Al doilea parametru pozitional este 2 Al 10-lea parametru pozitional este 10

Comanda set poate fi folosit pentru resetarea parametrilor poziionali. Dac este apelat fr nici un argument, comanda set va afia toate variabilele care au fost definite n acel shell, locale sau exportate. n momentul apelului comenzii cu unul sau mai multe argumente, parametrii pozitionali definii anterior se pierd (pentru a reveni la valorile iniiale se poate utiliza comanda set --).

186

UNIX

Fie exemplul urmtor:


#!/bin/bash #Numele script-ului este test2 echo Numele script-ului este $0 echo Parametrii sunt: $* echo Al doilea parametru pozitional este $2 echo Numarul parametrilor este $# arg_vechi=$* set ion maria cornel gheorghe stefan echo Parametrii sunt acum: $* set $(date) echo Astazi este $3 $2 $6 echo Vechii parametri sunt: $arg_vechi set $arg_vechi echo $1 $2 $3

n urma execuiei shell-script-ului de mai sus prin apelul: ./test2 1 2 3 se va afia:


Numele script-ului este ./test2 Parametrii sunt: 1 2 3 Al doilea parametru pozitional este 2 Numarul parametrilor este 3 Parametrii sunt acum: ion maria cornel gheorghe stefan Astazi este 15 Aug 2004 Vechii parametri sunt: 1 2 3 1 2 3

Variabilele speciale pot fi folosite i n construcii speciale:


#!/bin/bash #Numele script-ului este test3 nume=${1:?necesita un argument!} echo Buna ziua, $1!

Dac test3 este apelat fr nici un argument, va fi afiat mesajul de eroare: ./test3: 1: necesita un argument! Dac facem apelul: ./test3 Razvan, vom obine rezultatul: Buna ziua, Razvan!

187

Bourne again shell

8.3.4 Construcii condiionale i controlul fluxului Construciile condiionale ne permit s testm anumite condiii i apoi s executm anumite comenzi n funcie de rezultatul testrilor. Comanda if reprezint cea mai simpl construcie condiional utilizat pentru luarea deciziilor. Ca i shell-ul Bourne, bash utilizeaz valoarea lui exit-status pentru a vedea care este rezultatul unei comenzi (reamintim c n cazul n care comanda s-a ncheiat cu succes sau cu valoarea logic true exit-status-ul este egal cu zero iar n caz contrar exit-status-ul are o valoare diferit de zero). Valoarea lui exit-status pentru ultima comand este $?. Pentru a evalua starea de adevr a unei expresii este folosit comanda intern test, sau se folosesc parantezele ptrate. Considerm n continuare cteva exemple de utilizare a comenzii test, a parantezelor ptrate, construcia cu paranteze ptrate duble [[ ]] i cu paranteze duble (( )). Exemplul 1.
Vom introduce la linia de comanda: $ nume=barbu $ grep $nume /etc/passwd > /dev/null $ echo $? 0 #barbu a fost gasit in /etc/passwd $ test $nume != barbu $ echo $? 1 #numele nu este diferit de barbu $ [ $nume = barbu ] $ echo $? 0 #testul este adevarat de aceasta data $ [ $nume = [Bb]arbu ] $ echo $? 1 #comanda test nu permite folosirea metacaracterelor

Pentru a putea utiliza metacaractere n cadrul comenzii test trebuie s folosim parantezele ptrate duble, ca n exemplul urmtor:
$ [[ $nume == [Bb]arbu ]] $ echo $? 0

188

UNIX

Prin utilizarea parantezelor duble (( )) se pot evalua expresii numerice. Considerm exemplul urmtor:
$ x=3; y=5 $ (( x > y )) $ echo $? 1

Rezultatul afiat este 1 deoarece x nu este mai mare dect y (3<5). Comanda if Noul format al comenzii if pentru bash este:
if [[ com_test1 ]] then secventa_comenzi1 else secventa_comenzi2 fi

sau, pentru testri numerice:


if (( com_test1 )) then secventa_comenzi1 else secventa_comenzi2 fi

Observaie. else este opional. Comanda exit Comanda exit este utilizat pentru a termina shell-script-ul i a reveni la linia de comand. Comenzii exit i se poate da un argument (un numr ntre 0 i 255) pentru a indica faptul c programul s-a ncheiat cu succes sau nu. Asemntor cu exit-status-ul, valoarea 0 nseamn ncheierea cu succes a programului. Argumentul pe care l dm comenzii exit se afl stocat n variabila $?.

189

Bourne again shell

Comanda case Comanda case este utilizat pentru construcii condiionale multiple. Formatul acesteia este acelai cu formatul shell-ului standard Bourne:
case variabila in sablon_1) comenzi ;; sablon_2) comenzi ;; *) comenzi ;; esac

Dac nici una dintre valorile sablon_1, sablon_2, etc. nu corespund valorii variabilei respective, se vor executa n mod implicit comenzile ce urmeaz dup construcia special *).

8.3.5 Comenzi de ciclare Comenzile utilizate pentru ciclare sunt: for, while, until, select. Dintre acestea, primele trei ne sunt familiare din shell-ul Bourne. n shell-ul bash apare un nou mecanism de ciclare, denumit select, utilizat cu principalul scop de a crea meniuri. Comanda select afieaz un meniu cu opiuni numerotate 1, 2, 3 etc. Afiarea se face n fiierul standard error (pe ecran, implicit). Pe ecran, cererea de a introduce una dintre opiuni se face prin afiarea prompter-ului PS3 (al treilea prompter), care implicit are valoarea #?. Dac dorim s afim un mesaj, va trebui s modificm doar valoarea lui PS3. Dar s vedem cum funcioneaz comanda select: dup afiarea meniului i a prompter-ului PS3, se ateapt pentru introducerea unui numr din lista afiat. Input-ul va fi stocat n variabila special REPLY. De regul, comanda select se folosete mpreun cu comanda case pentru a crea un meniu ce permite utilizatorului s fac o selecie dintr-un meniu i pe baza acelei selecii s execute anumite comenzi. De asemenea, se pot utiliza variabilele predefinite LINES i COLUMNS pentru a schimba modul de afiare pe ecran a opiunilor (aceste variabile sunt definite

190

UNIX

ncepnd cu versiunea 2.0 bash). Pentru a ntrerupe execuia comenzii select se va folosi fie break (pentru ieirea din ciclul select), fie exit pentru a iei din program. Formatul general al instruciunii select este:
select variabila in lista do comenzi done

Prezentm n continuare cteva exemple de utilizare a comenzii select. Exemplul 1.


#!/bin/bash # Nume shell-script: meniu_select PS3=Selectati optiunea dorita: select prog in uname -n date cal who exit do $prog done

Execuia programului va duce la afiarea unui meniu:


1) uname -n 2) date 3) cal 4) who 5) exit Selectati optiunea dorita:

n funcie de opiunea selectat, se va executa comanda respectiv. Ciclul select va rula fie pn la introducerea opiunii 5 (exit va determina ieirea din program), fie pn la introducerea combinaiei Ctrl+C.

191

Bourne again shell

Exemplul 2.
#!/bin/bash # Nume shell-script: culori PS3=Alegeti una dintre culori sau exit: select alegere in albastru galben verde exit do case alegere in albastru) echo Albastrul este culoarea cerului! break;; galben) echo Galbenul este o culoare calda! break;; verde) echo Verde este padurea! break;; *) echo $REPLY nu este o optiune valida! echo Incercati din nou. ;; esac done

Iniial, se va afia meniul:


1) albastru 2) galben 3) verde 4) exit Alegeti una dintre culori sau exit:

n funcie de opiunea aleas se va afia mesajul corespunztor. Dac se introduce valoarea 4 se va iei din program i orice alt valoare introdus va afia mesajul n care se precizeaz c nu este o opiune valid i se va repeta introducerea opiunii. Rularea instruciunilor de ciclare n background Instruciunile de ciclare pot fi rulate n background, astfel nct programul poate continua fr s atepte terminarea instruciunii de ciclare.

192

UNIX

n exemplul urmtor se trimite un email mai multor utilizatori preluat din fiierul scrisoare:
#!/bin/bash for nume in radu andrei andra serban gabi do mail $nume < scrisoare done &

Semnul & (ampersand) de la sfritul instruciunii for determin execuia ciclului for n background. Programul i va continua execuia pn la terminarea ciclului for. Separatorul IFS Separatorul intern al shell-ului IFS (Internal Field Separator) are valoare de spaiu, tab sau caracter de linie nou (newline). El este folosit drept caracter separator n cadrul comenzilor pentru interpretarea semantic a cuvintelor cheie, precum: for, do, done, etc. Acest separator poate fi modificat de ctre utilizator dac se dorete utilizarea altui separator ntr-o list. nainte de a modifica valoarea separatorului, este bine s memorm vechea valoare a lui IFS n alt variabil, pentru a putea reface starea iniial a separatorului. Prezentm n continuare un exemplu de modificare a separatorului IFS.
#!/bin/bash # Exemplu pentru IFS nume=Radu:Andrei:Andra:Serban:Gabi ifs_vechi=$IFS IFS=: for persoana in $nume do echo Salut $persoana done IFS=$ifs_vechi set Cristi Cristina Paul for prenume in $* do echo Buna ziua $prenume done

193

Bourne again shell

La nceput, variabila nume are valoarea irului de caractere Radu:Andrei:Andra:Serban:Gabi, numele fiind separate de cte un caracter :. Vechea valoare a lui IFS este memorat n variabila ifs_vechi. Deoarece valoarea lui IFS este un caracter whitespace, trebuie ncadrat ntre ghilimele. Apoi lui IFS i se atribuie o nou valoare, semnul : care va fi de acum utilizat pe post de separator. Ca urmare a execuiei shell-script-ului anterior se va afia:
Salut Radu Salut Andrei Salut Andra Salut Serban Salut Gabi Buna ziua Cristi Buna ziua Cristina Buna ziua Paul

8.3.6 Funcii Funciile au fost introduse n shell-ul Bourne ncepnd cu versiunea AT&T UNIX SystemVR2 (SVR2) i le-au fost adugate o serie de mbuntiri n shell-ul Bourne Again. Funciile reprezint asocierea unui nume pentru o comand sau un grup de comenzi, fiind folosite pentru modularizarea programelor, fcndu-le astfel mai eficiente. Funciile sunt executate n contextul shell-ului curent, astfel c nu se creeaz un nou proces copil ca n cazul rulrii unui program executabil precum cat. Funciile pot fi scrise n fiiere separate pentru a fi ncrcate n memorie din shell-script atunci cnd trebuie folosite. n continuare sunt prezentate regulile de scriere a funciilor n Bourne Again Shell: 1. O funcie trebuie definit nainte de a fi utilizat. 2. Funcia ruleaz n mediul de lucru curent, partajnd variabilele din shell-script-ul ce o invoc i ofer posibilitatea de transmitere de argumente prin atribuirea acestora ca parametri poziionali. Variabilele locale pot fi create n cadrul unei funcii prin utilizarea funciei local. 3. Shell-ul determin dac se folosete un alias, o funcie, o comand intern sau un program executabil aflat pe hard-disc. Ordinea de cutare este: alias, funcie, comand intern, program executabil. 4. n momentul n care se utilizeaz comanda exit n cadrul unei funcii, se produce ieirea din shell-script-ul ce apeleaz funcia. Dac se

194

UNIX

iese din funcie, ntoarcerea n shell-script se face pe linia urmtoare apelului funciei. 5. Comanda return n cadrul unei funcii determin returnarea valorii exit-status a ultimei comenzi executate n cadrul funciei sau valoarea argumentului specificat. 6. Funciile pot fi exportate n sub-shell-uri folosind comanda intern export -f. 7. Pentru a lista funciile i definiiile acestora, se folosete comanda declare -f. ncepnd cu versiunea 2.x. bash, pentru a lista doar numele funciilor se folosete comanda declare -F. 8. Dac funciile sunt stocate ntr-un fiier separat, acestea pot fi ncrcate n mediul curent prin comanda source sau comanda dot (.). 9. Se permite declarea funciilor recursive (ce se auto-apeleaz). Nu exist o limit maxim impus pentru numrul de apeluri recursive. 10. Variabilele, ca i valorile trap sunt globale n cadrul funciilor. Ele sunt partajate att de ctre shell-script ct i de funciile invocate de acel shell-script. Dac o valoare trap este definit n cadrul unei funcii, ea este, de asemenea, partajat de shell-script. Alte comenzi legate de funcii. Pentru a reseta o funcie se folosete comanda unset. Formatul general al acestei comenzi este:
unset -f nume_functie

Pentru a exporta o funcie ntr-un sub-shell se folosete comanda export. Formatul general al acestei comenzi este:
export -f nume_functie

n cadrul unei funcii, argumentele pot fi transmise funciilor prin intermediul parametrilor poziionali. Parametrii poziionali sunt privai n cadrul funciilor, astfel nct argumentele unei funcii nu vor afecta parametrii poziionali utilizai n afara acesteia. Pentru a crea variabile locale (care nu vor mai fi valabile la ieirea din funcie) pentru o funcie anume putem folosi comanda intern local. Comanda return poate fi utilizat pentru a termina execuia funciei i a preda controlul script-ului apelant. Valoarea returnat de o funcie este egal cu valoarea exit-status returnat de ultima comand executat

195

Bourne again shell

n cadrul funciei, cu excepia cazului n care se specific un anumit argument prin intermediul comenzii return. n momentul n care se specific o valoare prin comanda return, aceast valoare este stocat n variabila ? i poate lua valori ntregi cuprinse ntre 0 i 255. Datorit acestei limitri, se poate utiliza substituirea comenzii pentru a captura valoarea returnat de o funcie. n acest sens, se poate scrie toat funcia ntre paranteze precedate de semnul $ sau ntre apostrofurile inverse (``) pentru a captura i atribui valoarea returnat de ctre funcie unei variabile, ca i n cazul obinerii rezultatului unei comenzi UNIX. Prezentm n continuare cteva exemple de utilizare a funciilor. Exemplul 1.
#!/bin/bash # Nume shell-script: verific_functie function UTI { echo Eroare: $* 2>&1; exit 1; } if (( $# != 2 )) then UTI $0: necesita doua argumente fi if [[ ! ( -r $1 && -w $1 ) ]] then UTI $1: fara drepturi de citire si scriere fi echo Argumentele sunt: $* ...# comenzi

Explicaii. n exemplul anterior se definete o funcie UTI ce este utilizat pentru a afia un mesaj de eroare pe ecran (fiierul standard de eroare). Argumentele funciei constau n orice ir de caractere trimise odat cu apelul funciei. Argumentele sunt stocate n $*, variabila special ce stocheaz toi parametrii poziionali. n cadrul unei funcii, parametrii poziionali sunt considerai locali i nu au efect asupra parametrilor utilizai n afara funciei. n cadrul script-ului se verific dac numrul parametrilor poziionali este 2 i n caz contrar se afieaz mesajul de eroare corespunztor. n momentul apelrii funciei UTI, irul $0: necesita doua argumente este transmis funciei i memorat n variabila $* iar comanda echo va afia mesajul de eroare i apoi se va returna valoarea de ieire 1, ceea ce indic faptul c ceva nu a fost n regul. n continuarea programului,

196

UNIX

se verific dac primul argument este un fiier care poate fi citit i modificat, iar funcia UTI va fi apelat cu argumentul $1: fara drepturi de citire si scriere. Argumentele ce provin de la linia de comand sunt stocate din nou n $*, fr a avea efect pentru valoarea $* din cadrul funciei. Exemplul 2.
#!/bin/bash # Nume shell-script: incrementare INC () { local suma; let suma=$1 + 1 return $suma } echo -n Suma este: INC 5 echo $? echo $suma # variabila suma nu este cunoscuta in #afara functiei

Explicaii. n exemplul anterior se definete o funcie INC. n cadrul acestei funcii se declar variabila local suma, care nu este cunoscut n afara funciei. n momentul apelului funciei, valoarea primului argument, $1 va fi incrementat cu 1 iar rezultatul va fi atribuit variabilei suma. Comanda intern return va atribui variabilei $? valoarea din variabila suma, apoi irul este afiat pe ecran. Funcia INC este apelat cu argumentul 5, iar exit-status-ul ei va fi stocat n variabila $?. Pentru ultima linie din program nu se va afia nimic, deoarece variabila suma a fost declarat doar n interiorul funciei (cu ajutorul comenzii interne local) i valoarea acestei variabile nu este cunoscut n afara funciei.

197

Bourne again shell

Exemplul 3.
#!/bin/bash # Nume shell-script: cub function CUB { local rez; let rez=$1 * $1 * $1 echo Numarul ce va fi ridicat la cub este $1 echo Rezultatul este $rez } echo -n Introduceti numarul pentru ridicare la cub: read numar rezultat=$(CUB $numar) echo -n $rezultat

Explicaii. n exemplul anterior se definete o funcie CUB. n cadrul acestei funcii se declar variabila local rez, care va stoca rezultatul. n cadrul script-ului se citete valoarea care va fi ridicat la cub n variabila numar, apoi se atribuie variabilei rezultat valoarea ntoars de funcie prin intermediul substituirii comenzii (construcia cu numele funciei ntre paranteze precedate de semnul $). Prin comanda echo de pe ultima linie a shell-script-ului se afieaz rezultatul. Observaie. Ca i n Bourne Shell, funciile se ncarc n memorie cu ajutorul comenzii dot (.). n Bourne Again Shell exist ns i comanda source, care se apeleaz astfel:
$ source fisier_functii

unde fisier_functii este fiierul ce conine funciile ce vor fi utilizate.

198

Bibliografie 1 2 3 4 Anderson, R. Bach, M.J. Brescu, C. L., Duda, L. Burtch, K.O. UNIX File system Administration, Sams Publishing, 2002 The Design of the UNIX Operating System, Prentice Hall, Englewood Cliffs, N.J., 1986 Internet pentru nceptori, Bucureti, Editura TIMS, 1995 Linux Files, Users and Shell Customization with Bash, Sams, Developers Library, 2004 Tru64 UNIX Documentation Overview, Compaq Computer Corporation, Houston, Texas, USA, 1999-1 Tru64 UNIX Security, Compaq Computer Corporation, Houston, Texas, USA, 1999-2 Mastering Linux, sec. Edition, USA, Sybex, 2001 Network Security, prezentare Cisco Seminar Series, 1998 Sisteme de operare MS-DOS i UNIX, Bucureti, Editura Viaa Romneasc, 1994 Sisteme de calcul i operare, Bucureti, 1995/1 Sisteme de calcul i operare, Bucureti, Editura Aldo, 1995 Sun Enterprise Cluster 2.2, articol PC Report, noiembrie 1999 The Internet Complete Reference, 1993

Compaq

Compaq

7 8 9

Danesh, A. Michael, J. David, N. Dodescu Gh., Vasilescu, A. Dodescu, Gh., Nstase, F. Dodescu, Gh., Nstase, F Done, G. Hahn, H., Stout, R.

10 11 12 13

199

UNIX

14 15 16 17 18 19 20

Hall, E. A., O'Reilly, & Assosiates Kurose, J. Keith, R., Wesley, A. Lammle, T. McMullen, J. Myers, D., Lorenz, J. Nstase, F. Pnoiu, Al.

Internet Core Protocols: the definitive guide, Inc., 2000 Computer Networking, A Top-Down Approach Featuring the Internet, 2001 CCNA Study Guide, Second Edition, Sybex, 2000 Advanced UNIX users handbook, Prentice Hall PTR, 2000 Fundamentals of UNIX Companion Guide, Cisco Systems Inc., 2002 Arhitectura reelelor de calculatoare, Bucureti, Editura Economic, 1999 Compaq Tru64 UNIX, articol PC Report, iunie 1999 GNU/Linux: o alegere moral?, articol PC Report, noiembrie 1999 UNIX users handbook, sec. Edition, Prentice Hall PTR, 2002 UNIX Shells by Example, third edition, Prentice Hall PTR, 2002 Punei Linux-ul la treab, articol PC Magazine, februarie 2000 Intranet, Bucureti, Editura ASE, 1999

21

Piti, A.

22 23 24 25

Poniatowski, M. Quigley, E. Rosch, L. W. Roca, I. G., pu, N., Cristea, V., Atanasiu, I., Costinescu B., Nstase, F., Stanciu, C., Paiu, O., Godza, G.

200

Bibliografie

26 27 28 29 30 31 32 33 34 35

Sage, G. R. Stallings, W. Stevens, W. R. Tanenbaum, A. Tanenbaum, A. Taylor, D. Toxen, B. Vasilescu, A. Wrightson, K., Merlino, J. Zota, R. D.

UNIX pentru profesioniti, Timioara, Editura de Vest, 1992 Operating Systems, fourth edition, Prentice Hall PTR, 2001 UNIX Network Programming, Prentice Hall, Englewood Cliffs, N.J., 1990 Computer Networks, 3rd ed., PrenticeHall, 1996 Reele de calculatoare, Trgu Mure, Editura Agora, 1998 UNIX Disk Usage, Sams, informIT.com, Ianuarie 2003 Linux Security: The Seven Most Deadly Sins, Prentice Hall PTR, 2003 Reele de calculatoare, Bucureti, Editura Inforec, ASE 1999 Mastering UNIX, USA, Sybex, 2001 UNIX interaciunea dintre procese i kernel, lucrare la Simpozionul Naional de Informatic Craiova, 1998 Sisteme de operare pentru reele de calculatoare, Bucureti, Editura Economic, 2002 Sistemul de operare UNIX - Utilizare i programare shell, Bucureti, Editura ASE, 2003

36

Zota, R. D.

37

Zota, R. D.

201

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