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

Platforma hardware

Vnztor

A/UX

Macintosh

Apple Computer

AIX

Staii i mainframe-uri IBM,


RS/6000

IBM

HP-UX

Staii HP RISC

Hewlett-Packard
Corporation

Linux

Intel x86

Shareware

NextStep

Intel 486 sau Pentium, Next

Next Computer

OSF/1 i Ultrix

Staii DEC VAX i Alpha

Digital Equipment
Corporation

SCO OpenServer

Intel 486 sau Pentium

Santa Cruz Operation

Solaris

Staii Sun Sparc i Intel x86

SunSoft

UNIXWare

Intel 486 sau Pentium

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

Blocurile de stocare

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

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:
/bin
/dev
/etc
/lib
/mnt

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

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:

2.2

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

Principalele tipuri de fiiere existente pe un sistem UNIX sunt:

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

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

Descriere

/dev/cua

Director pentru dispozitive seriale

/dev/dsk

Director pentru dispozitive de tip bloc


(hard-discuri, CD-ROM-uri, etc.)

/dev/fd

Director pentru uniti floppy

/dev/kmem

Director pentru memoria virtual kernel

/dev/log

Director socket ctre login-ul sistem

/dev/mem

Dispozitiv pentru memoria fizic

/dev/null

Dispozitivul null

/dev/pts

Pseudo-terminale

/dev/rdsk

Director pentru echipamente device de tip


caracter

/dev/rmt

Director pentru medii de stocare movibile


band magnetic

/dev/swap

Spaiul de swap

/dev/tty

Director pentru linii terminal

/dev/zero

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

sys

60676 Aug 22 1994 Lib

-r--r--r--

1 root

sys

60676 Aug 22 1994 README

drwxr-xr-x 2 root

sys

60676 Aug 22 1994 Source

-rwxr-xr-x 2 root

sys

60676 Aug 22 1994 gzexe

-rwxr-xr-x 2 root

sys

60676 Aug 22 1994 gzip

-rwxr-xr-x 1 bin

bin

242436 Feb 20 16:07 httpd

-rwsr-xr-x 1 uucp uucp

599604 Sep 22 1995 kermit

-rwxr-x--x 1 root

sys

171195 Jan 22 12:15 memhog

-rwxr-x--x 1 root

sys

5599 Jan 22 12:15 nlsym

-rwxr-xr-x 2 root

sys

553836 Feb 20 16:40 perl

-rwxr-xr-x 2 root

sys

553836 Feb 20 16:40 perl5.003

-rwxr-xr-x 1 root

sys

13855 Feb 20 16:40 perlbug

-rwxr-xr-x 1 root

sys

8984 Feb 20 16:40 perldoc

drwxr-xr-x 2 root

sys

60676 Aug 22 1994 src

-rwxr-x--x 1 root

sys

108781 Jan 22 12:15 u486mon

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

r w x

r w x

r w x

r w x

r w -

r - -

r w x

r - -

r - -

r w x

- - -

- - -

r - x

- - -

- - -

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

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

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

Data

Numele fiierului

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
*
?
;
[]
>

<

2>
>>

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)

Formatul comenzii
*
?
comanda;comanda
[domeniu]
comanda > fisier

comanda < fisier

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

$ mv student /home/serban/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

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

Semnificaie
Cutare dup nume

type tip_fisier

Cutare dup tip

mtime [+|-]n

Cutare dup
data/ora ultimei
modificri
Cutare dup
data/ora ultimului
acces la fiier
Cutare dup
permisiuni de acces

atime [+|-]n

perm mod

size [+|-]n[c]

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

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)

Acioneaz pe post de orice caracter i poate fi


utilizat de mai multe ori

* (asterisc)

Este folosit pentru zero, unul sau mai multe


caractere

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

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

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

-r
-f

-d
+nM
-o
nume_fisier

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

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

Creeaz o nou arhiv jar

Listeaz coninutul fiierului jar

Extrage fiierele specificate din arhiva jar

F
V

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)

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

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

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

Comanda de iniializare a unei


comunicaii telnet cu serverul infocib

Connected to infocib.
AIX version 5 infocib

Mesajul primit ca urmare a stabilirii


conexiunii pe serverul infocib

login: stud

Login cu nume de utilizator stud

password:

Se introduce parola

Welcome to infocib rs6000 aix 5L

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

Name: stud

Se cere introducere numelui de login se introduce numele de utilizator stud

Password required for stud.

Se afieaz un mesaj prin care se


specific faptul c utilizatorul stud
trebuie s se autentifice prin
introducerea parolei

Password:

Se introduce parola

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

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.

ftp> bye
Goodbye.

nchiderea conexiunii ftp.

Apariia prompter-ului de pe server.

89

Sertvicii de reea

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


Comanda

Explicaii

ascii

Seteaz tipul de transfer al fiierelor la ASCII (se vor transfera


fiiere ASCII de pe un sistem pe cellalt). Aceasta este setarea
implicit.

binary

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.

cd

Modific directorul curent de lucru pe calculatorul de la distan.

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.

get

Comanda este utilizat pentru a copia un fiier de pe calculatorul


de la distan pe calculatorul local.

lcd

Modific directorul curent pe calculatorul local.

ls

Listeaz pe ecran coninutul directorului curent de pe calculatorul


de la distan.

mget

Comanda este utilizat pentru copierea mai multor fiiere de pe


calculatorul de la distan.

put

Cu ajutorul comenzii put se copiaz fiierul specificat de pe


calculatorul local pe calculatorul de la distan.

mput

Cu aceast comand se copiaz mai multe fiiere de pe


calculatorul local pe calculatorul de la distan.

quit/bye

Se nchide conexiunea ftp cu calculatorul de la distan.

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.

ms
ms
ms
ms
ms
ms
ms
ms

loss

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

Use
UH

Interface
Pmtu
0
133563 lop0

10.1.1.10

UH

356

10.1.1.110

UH

10.1.1.110

10.1.1.10

4136
4136
1300
1300
127.0.0.1
4136
10.1.1.1
UG

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

Editoare de text

1. Editoare de text
5.1

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

Semnificaie

j (sgeat n jos)

Deplasare o linie n jos

k (sgeat n sus)

Deplasare o linie n sus

h (sgeat stnga)

Deplasare cu un caracter la stnga

l (sgeat dreapta)

Deplasare cu un caracter la dreapta

Tasta <SPACE>

Deplasare la dreapta cu un caracter

Deplasare la dreapta cu un cuvnt

Deplasare la stnga cu un cuvnt

Deplasare la sfritul liniei

0 sau ^

Deplasare la nceputul liniei

Tasta <RETURN>

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

Semnificaie

Se terge caracterul din dreptul cursorului

dw
5dw

Se terge cuvntul (sau partea din cuvnt) situat la


dreapta cursorului
Se terg 5 cuvinte la dreapta

dd

Se terge ntraga linie pe care este poziionat cursorul

2dd

Se terg 2 linii ncepnd cu linia curent

3x

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

5cw
r

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

dd, apoi p

terge, apoi alipete (paste)

yy, apoi p

Copiaz, apoi alipete

yy

Copiaz o linie

Alipete linia copiat sau tears sub linia curent

Alipete linia copiat sau tears deasupra liniei curente

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

Efect

Ctrl+f

Deplasarea cursorului nainte cu un caracter

Ctrl+b

Deplasarea cursorului napoi cu un caracter

Ctrl+p

Deplasarea cursorului pe linia anterioar

Ctrl+n

Deplasarea cursorului pe linia urmtoare

Ctrl+a

Deplasarea cursorului la nceputul liniei curente

Ctrl+e

Deplasarea cursorului la sfritul liniei curente

Ctrl+v

Deplasarea cursorului nainte cu o pagin

Ctrl+y

Deplasarea cursorului napoi cu o pagin

Ctrl+w

Caut text

Ctrl+l

Reafieaz ecranul pico

Ctrl+d

terge un caracter de la poziia cursorului

Ctrl+^

ncepe selectarea textului ncepnd cu poziia cursorului

Ctrl+k

Taie (cut) textul selectat sau linia curent

Ctrl+u

Alipete (paste) ultimul text tiat la poziia cursorului

Ctrl+i

Insereaz un tab n poziia cursorului

Ctrl+j

Aliniaz paragraful curent

Ctrl+t

Corectarea semantic

Ctrl+r

Insereaz (read - citete) coninutul unui fiier la cursor

Ctrl+o

Salveaz (output) fiierul

Ctrl+g

Vizualizarea help-ului

Ctrl+x

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

Valoare zecimal

Drepturi de acces

000
001
010
011
100
101
110
111

0
1
2
3
4
5
6
7

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

7.1.3

-d examen.dat; echo $?
-x examen.dat; echo $?
-s examen.dat; echo $?
examen.dat ] ; echo $?
stud.dat ] ; echo $?

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

Gramatica Shell

7.2.1

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

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

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

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

Comanda

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

Opiunea echo

sh x nume_script

Opiunea verbose

sh v nume_script

Opiunea noexec

sh n nume_script

Seteaz echo-ul

set x

Urmrete execuia unui script

Reseteaz echo-ul

set +x

Oprete urmrirea execuiei unui


script

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

Anderson, R.

UNIX File system Administration, Sams


Publishing, 2002

Bach, M.J.

Brescu, C. L.,
Duda, L.

The Design of the UNIX Operating


System, Prentice Hall, Englewood Cliffs,
N.J., 1986
Internet pentru nceptori, Bucureti,
Editura TIMS, 1995

Burtch, K.O.

Linux Files, Users and Shell


Customization with Bash, Sams,
Developers Library, 2004

Compaq

Tru64 UNIX Documentation Overview,


Compaq Computer Corporation,
Houston, Texas, USA, 1999-1

Compaq

Tru64 UNIX Security, Compaq


Computer Corporation, Houston, Texas,
USA, 1999-2

Danesh, A.
Michael, J.

Mastering Linux, sec. Edition, USA,


Sybex, 2001

David, N.

Network Security, prezentare Cisco


Seminar Series, 1998

Dodescu Gh.,
Vasilescu, A.

Sisteme de operare MS-DOS i UNIX,


Bucureti, Editura Viaa Romneasc,
1994

10

Dodescu, Gh.,
Nstase, F.

Sisteme de calcul i operare, Bucureti,


1995/1

11

Dodescu, Gh.,
Nstase, F

Sisteme de calcul i operare, Bucureti,


Editura Aldo, 1995

12

Done, G.

Sun Enterprise Cluster 2.2, articol PC


Report, noiembrie 1999

13

Hahn, H.,
Stout, R.

The Internet Complete Reference, 1993

199

UNIX

14

16

Hall, E. A.,
O'Reilly, &
Assosiates
Kurose, J.
Keith, R.,
Wesley, A.
Lammle, T.

17

McMullen, J.

Advanced UNIX users handbook,


Prentice Hall PTR, 2000

18

Myers, D.,
Lorenz, J.

Fundamentals of UNIX Companion


Guide, Cisco Systems Inc., 2002

19

Nstase, F.

Arhitectura reelelor de calculatoare,


Bucureti, Editura Economic, 1999

20

Pnoiu, Al.

Compaq Tru64 UNIX, articol PC Report,


iunie 1999

21

Piti, A.

GNU/Linux: o alegere moral?, articol


PC Report, noiembrie 1999

22

Poniatowski, M.

UNIX users handbook, sec. Edition,


Prentice Hall PTR, 2002

23

Quigley, E.

UNIX Shells by Example, third edition,


Prentice Hall PTR, 2002

24

Rosch, L. W.

Punei Linux-ul la treab, articol PC


Magazine, februarie 2000

25

Roca, I. G.,
pu, N.,
Cristea, V.,
Atanasiu, I.,
Costinescu B.,
Nstase, F.,
Stanciu, C.,
Paiu, O.,
Godza, G.

Intranet, Bucureti, Editura ASE, 1999

15

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

200

Bibliografie

26

Sage, G. R.

UNIX pentru profesioniti, Timioara,


Editura de Vest, 1992

27

Stallings, W.

Operating Systems, fourth edition,


Prentice Hall PTR, 2001

28

Stevens, W. R.

UNIX Network Programming, Prentice


Hall, Englewood Cliffs, N.J., 1990

29

Tanenbaum, A.

Computer Networks, 3rd ed., PrenticeHall, 1996

30

Tanenbaum, A.

Reele de calculatoare, Trgu Mure,


Editura Agora, 1998

31

Taylor, D.

UNIX Disk Usage, Sams, informIT.com,


Ianuarie 2003

32

Toxen, B.

Linux Security: The Seven Most Deadly


Sins, Prentice Hall PTR, 2003

33

Vasilescu, A.

Reele de calculatoare, Bucureti,


Editura Inforec, ASE 1999

34

Mastering UNIX, USA, Sybex, 2001

35

Wrightson, K.,
Merlino, J.
Zota, R. D.

36

Zota, R. D.

Sisteme de operare pentru reele de


calculatoare, Bucureti, Editura
Economic, 2002

37

Zota, R. D.

Sistemul de operare UNIX - Utilizare i


programare shell, Bucureti, Editura
ASE, 2003

UNIX interaciunea dintre procese i


kernel, lucrare la Simpozionul Naional
de Informatic Craiova, 1998

201

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