Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Shell-ul ca limbaj de programare

algoritmi



+ Font mai mare | - Font mai mic



Shell-ul ca limbaj de programare

Pina in acest moment, s-a presupus ca toate comenzile prezentate sint introduse de utilizator de la tastatura si sint apoi direct executate. Astfel, limbajul de comanda SHELL a fost privit ca un limbaj control al lucrarilor (job control language) care permite utilizatorului sa precizeze actiuni si mediul in care ele vor fi executate. Shell-ul se poate folosi de asemenea si ca limbaj de programare, secventele de comenzi putind fi grupate in programe numite proceduri shell. Programele shell pot lucra cu notiuni caracteristice limbajelor de nivel inalt cum ar fi variabila, subrutina, parametri, structuri de control si operatii caracteristice macroprocesoarelor.



Variabila shell

O variabila shell se defineste printr-un nume, care poate avea ca va-

loare un sir de caractere, atribuit cu semnul egal '=', precum urmeaza

variabila = valoare

Referirea unei variabile se face prin includerea inaintea numelui ei a caracterului '$' -situatie in care se realizeaza efectiv substitutia variabilei prin valoarea sa. Exemplu:

atribuire : $ pozit = /usr/ion

utilizare : $ cd $pozit

Variabilele shell pot fi:

a) Variabile modificate dinamic de interpretor

Aceste variabile au o semnificatie prestabilita si sint actualizate in mod automat de catre interpretor. Incercarea de modificare a acestora de catre utilizator este ignorata.

$# numarul de parametri ai unei proceduri shell;

$? codul de revenire al ultimei comenzi executate;

$$ identificetorul de proces asociat shell-ului;

$! identificatorul ultimului proces lansat in background;

$- optiunile cu care a fost lansat shell-ul;

$n parametrii transmisi procedurilor shell pe linia de comanda

(numarul n poate lua valori in intervalul 1..9)

b) Variabile atribuite la intrarea in sesiune

Aceste variabile sint initializate de catre shell la deschiderea unei sesiuni utilizator cu valorile precizate in fisierele /etc/environment, /etc/profile si $HOME/.profile, constituind mediul (environment) in care se vor executa toate comenzile lansate ulterior.

$HOME se refera la directorul alocat utilizatorului la intrarea in sesiune

(argument implicit al comenzii cd);

$PATH defineste lista directorilor ce sint parcursi de interpretor in cautarea

fisierului executabil corespunzator comenzii introduse; (de exemplu:./;

/usr/bin care indica parcurgerea in ordine a directorului curent, apoi a

directorului /bin si /usr/bin);

$PS1 defineste prompter-ul asociat interpretorului (implicit $ pentru

utilizatorul obisnuit si # pentru superuser)

$PS2 stabileste al doilea prompter (de continuare a liniei de comanda,vezi

shell-ul ca limbaj de programare) al interpretorului (implicit >).

$LOGNAME contine numele de conectare al utilizatorului si este pozitionat

automat de catre sistem .

$MAIL contine numele directorului in care este plasata posta. Aceasta

variabila este folosita de catre shell pentru a anunta utilizatorul despre

momentul cand se adauga o informatie noua in acest director.

$SHELL contine numele programului shell folosit de catre editorul de texte

vi si de alte comenzi interactive, pentru a determina shell-ul ce va fi

executat (sh, csh sau ksh) atunci cand se introduce o comanda de trecere

imediata a controlului catre shell.

$TERM este folosita de vi si de alte programe orientate pe ecran pentru a

obtine informatii despre tipul de terminal care se foloseste. Aceasta

informatie este necesara pentru a permite programelor sa-si ajusteze

iesirea conform posibilitatilor terminalului.

Pentru a afisa valoarea unei variabile se foloseste comanda echo, de exemplu

linia de comanda care urmeaza afiseaza valoarea variabilei PATH :

$echo $PATH

/bin:/home/ion/bin:/var/adauga/bin:

Valoarea variabilei HOME se poate folosi in comenzi ca de exemplu:

$mv raport $HOME/Docum

pentru a evita introducerea in intregime a numelui de cale pentru directorul

destinatie.

Procedura shell

O procedura shell este o colectie de comenzi sau instructiuni ale limbajului de comanda shell ce pot fi preluate dintr-un fisier text sau de la tastatura. Ea poate fi lansata in executie in orice moment, in doua moduri :

a) $sh fis1

sau

b) $chmod fis1 a+x

$fis1

unde fis1 este un fisier text.

Procedurile shell pot contine parametri, interpretati pozitional, pentru care sunt substituite valorile reale la momentul executiei. In interiorul unei proceduri, parametrii de la lina de comanda sunt referiti prin simbolurile $1, $9 si sunt substituiti pozitional dupa cum urmeaza :

$1 reprezinta primul parametru de pe linia de comanda (primul cuvant care apare dupa numele comanzii), $2 al doilea parametru s.a.m.d. Numele comenzii poate fi accesat prin intermediul parametrului $0. O procedura poate fi apelata cu mai mult de noua argumente in linia de comanda, argumentele suplimentare putand fi accesate prin folosirea comenzii interne 'shift'.In urma executiei acestei comenzi continutul variabilei $n se copie in variabila $n-1.

Pentru exemplificare se presupune ca se doreste un listing cu toti utilizatorii conectati la un anumit tip de terminal si nu pentru orice tip posibil, deoarece sirul de caractere 'tty' este in mod permanent inclus in definire.Procedura foloseste comanda 'grep' care este de tip filtru.

Un filtru este o comanda care are urmatoarea schema de lucru : a) citeste un fisier; b) prelucreaza acel fisier intr-un anumit fel; c) tipareste rezultatul prelucrarii.

Comanda 'grep' extrage dintr-un fisier acele linii care contin o configuratie predeterminata de caractere.

Procedura va contine o singura linie :

who | grep tty

si se poate lansa in executie prin :

$sh whotty

Rezultatul obtinut poate fi de forma:

petre tty2 mar 15 11:43

Procedura 'whotty' se poate generaliza, utilizand un parametru pe linia de comanda, care reprezinta tipul terminalului. Ca de exemplu in procedura 'whoterm' :

who | grep $1

Astfel secventa :

$sh whoterm tty

va afisa :

petre tty2 mar 15 11:43

exact acelasi rezultat ca si 'whotty', intrucat $1 va fi substituit, la executie, prin sirul de caractere 'tty'. Se poate folosi, deci, aceiasi procedura pentru afisarea numelor utilizatorilor conectati la orice tip de terminal.

Fisierul '.profile' .

Acest fisier al carui continut este constituit din comenzi sau instructiuni catre shell, permite configurarea mediului de lucru propriu al unui utilizator si este citit si executat de catre shell la fiecare deschidere a unei sesiuni utilizator. De exemplu, daca in fisierul '.profile' exista liniile urmatoare, atunci terminalul cu care se lucreaza este de tip 'vt100', si la fiecare conectare se va starta executia programului 'calendar' :

TERM=vt100

export TERM

calendar

Daca se doreste vizualizarea pe ecran a continutului acestui fisier, se va putea folosi, de exemplu, comanda :

$cat .profile

Numele acestui fisier incepe cu '.' pentru a nu fi listat decat la apelul comenzii 'ls' cu parametrul '-a', un utilizator neavizat nefiind astfel constient de existenta acestuia.

Fisierele '/etc/environment' si '/etc/profile'.

Ansamblul de variabile si valori care sunt furnizate unui program constituie mediul (environment-ul) programului. Variabilele de mediu sunt mostenite de catre procesele utilizator de la shell-ul care le-a lansat. Acesta adauga la propriile variabile de mediu (pe care la randul sau le-a mostenit de la procesul 'init' si care au fost citite de catre acesta din fisierul '/etc/environment') variabilele citite din fisierele '/etc/profile' si '$HOME/.profile'. Fisierele '/etc/environment' si '/etc/profile', spre deosebire de '$HOME/.profile' contin informatii valabile pentru toate procesele lansate de catre shell.

Afisarea variabilelor de mediu curente se poate face cu comanda 'env' :

$env

HOME=/home/students/pr1993/cs930764

PWD=/etc/locks/bin/vtu

MAILRC=/home/students/pr1993/cs930764/mailrc

SHELL=/bin/bash

MAIL=/var/spool/mail/cs930764

LOGNAME=cs930764

PS1=:

PS2=

TERM=vt100

PATH=/usr/bin:/bin:/usr/lpp/vdi/bin/nkc:

Exportul variabilei.

Mediul unei comenzi este reprezentat de valorile variabilelor shell care sunt cunoscute de acea comanda.

Valorile variabilelor de mediu pozitionate de catre shell nu sunt mostenite in mod explicit de catre procesele lansate de acesta. Pentru ca un proces sa poata folosi o valoare a unei variabile de mediu, atribuirea acesteia trebuie sa se faca pe linia de comanda (de obicei inaintea numelui comenzii) sau in interiorul programului. Sa presupunem, de exemplu, ca fisierul de comenzi 'biluta' contine instructiunea :

echo $term

In acest caz, secventa de comenzi :

$term=vt100

$bubu

nu va afisa nimic, deoarece variabila 'term' nu este cunoscuta in fisierul 'bubu' in mod implicit. Pentru ca programul sa afiseze sirul de caractere 'vt100', este necesar fie ca atribuirea sa se faca in fisierul 'bubu', inaintea instructiunii 'echo', fie la linia de comanda ca in exemplu :

$term=vt100 bubu

Aceste atribuiri sunt valabile numai pe durata executiei comenzii. Pentru aface cunoscute valorile variabilelor de mediu asociate unui anumit proces in afara acestuia (tuturor proceselor lansate in acelasi shell) se foloseste comanda interna 'export'. Astfel, daca se doreste ca valoarea variabilei 'term' sa fie utilizata cu valoarea pozitionata in interiorul fisierului 'biluta' si de catre alte programe, se folosesc instructiunile :

term=vt100

export term

Instructiunea 'export' este apelata in fisierele '/etc/profile' si '.profile' pentru a face cunoscute tuturor programelor anumite variabile de mediu ale shell-ului ce au o importantza deosebita cum ar fi : PATH, HOME, TERM etc.

Executie conditionata.

Modul de terminare a executiei unei comenzi este memorat de shell intr-o variabila interna numita 'exit status' (stare de iesire). Valoarea sa poate fi testata de utilizator pentru a determina modul in care s-a incheiat executia ultimei comenzi (zero -succes, diferit de zero -eroare). Shell-ul poate apoi utiliza 'exit status' pentru a decide asupra actiunii urmatoare.

Interpretorul prevede trei constructii de baza pentru executia conditionata :

constructiile 'if', 'while' si 'until'.

Constructia 'if' exista in doua forme :

if then

si

if then else

precum este iustrat in urmatarele doua situatii :

if lista_de_comenzi

then lista_de_comenzi

fi

si

if lista_de_comenzi

then lista_de_comenzi

else lista_de_comenzi

fi

In constructia 'if' se verifica intotdeauna doar succesul ultimei comenzi din lista deoarece shell-ul tine evidenta doar a unui singur indicator de tip 'exit status'. Cuvantul cheie 'fi' este utilizat pentru a indica sfarsitul listei de comenzi pentru executia conditionata.Constructia while permite repetarea unui sir de comenzi atit timp cit comenzile din cadrul conditiei nu se executa cu succes. Sintaxa structurii

este:

until lista_de_comenzi

do lista_de_comenzi

done

Sa presupunem ca trebuie scris un program shell care asteapta pina cind este creat un anumit fisier. O metoda ar fi sa se utilizeze structura while:

while test! -r procedure;

do sleep 1;

done

O alta metoda foloseste structura until:

until test -r procedure;

do sleep 1;

done

Interpretorul de comenzi contine, de asemenea, doua comenzi interne numite true si false, care returneaza respectiv o stare de iesire zero si unu.Acestea pot fi folosite, de exemplu pentru realizarea unor bucle infinite,ca mai jos:

while true

do

date;

sleep 60;

done

Shell-ul de tip Bourne are doi operatori conditionali:

-operatorul dublu ampersand'&&'.

Cind doua comenzi sint separate printr-un dublu ampersand, a doua comanda seva executa doar daca prima comanda reintoarce starea de iesire zero. Astfel comanda

$ test -d /usr/kc&&echo succes!

va tipari mesajul succes! daca fisierul /usr/kc este un director (-d).Comanda interna test este folosita pentru a testa diferite conditii.

-operatorul bara dubla '||'.

Daca doua comenzi sint separate prin aceste 2 bare, se va executa a doua comanda daca prima comanda reintoarce o stare de iesire (exit status) nonzero.Astfel comanda:

$ test -d /usr/kc || echo eroare!

va tipari mesajul eroare!, daca fisierul nu exista sau daca el exista dar nu este fisier director.

Concluzii la limbajul de comanda al Shellului

In proiectarea unei aplicatii nu foarte complexe, utilizatorul poate opta pentru limbajul de comanda al shell-ului in locul unui limbaj de nivel inalt (C,FORTRAN,PASCAL,etc.).In alegerea solutiei trebuie sa fie luate in considerare urmatoarele aspecte:

Atunci cind viteza de executie a unui program este importanta vor

trebui folosite limbaje mai eficiente decit cel al shell-ului,

deoarece folosirea acestuia din urma duce la scaderea vitezei de

executie.

O situatie in care se foloseste shell-ul ca limbaj de programare este

atunci cind solutia problemei implica o multime de operatii care sint

comenzi sistem standard pentru UNIX (cautarea intr-un fisier, sortarea

si transformarea fisierelor, crearea si mutarea fisierelor etc.).

Un alt criteriu de decizie consta in tipul datelor de baza implicate

in problema. Daca datele de prelucrat sint reprezentate de linii de

text sau fisiere text, atunci shell-ul poate reprezenta o buna

solutie.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1423
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved