CATEGORII DOCUMENTE |
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
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 |
Vizualizari: 1410
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved