Sunteți pe pagina 1din 18

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu

Programare Shell
1. Introducere
1.1 Ce este shell-ul ? Shell-ul este o componenta a sistemului de operare care permite interpretarea comenzilor UNIX tastate de catre utilizator in terminalul UNIX, sau in consola. A interpreta aceste comenzi inseamna de fapt a transforma comenzile utilizator in procese care se pot executa la nivelul procesorului. De exemplu la tastarea comenzii date care permite afisarea datei curente procesorul va trebui sa citeasca informatiile referitoare la ora sistemului de la ceasul procesorului, sa converrteasca aceste sdate intr-un format inteligibil, si apoi sa tipareasca aceste date aflate intr-un format citibil la terminalul utilizatorului. Din acest exemplu se poate trage concluzia ca toate comenzile UNIX nu se pot realiza direct la nivelul procesorului, ci este nevoie de un mediu care sa permita aceasta translatare, transpunere din formatul de comanda UNIX in operatii care se pot efectua la nivelul procesorului. Cuvantul shell defineste in limba engleza termenul de cochilie. Aceasta cochilie poate fi vizualizata in schita de mai jos care prezinta componentele sistemului de operare UNIX :

Asa cum se poate obseva din figura de mai sus shell-ul UNIX este un limbaj de comenzi. Deci elementele constitutive ale shell-ului sunt comenzile UNIX. Echivalentul literar si stiintific in limba romana pentru cuvantul shell este de interpretor de comenzi. Pentru sistemele de operare de tip UNIX shell-ul poate fi interpretat ca fiind aplicatia Konsole, pentru sistemele de operare Windows 9x este command.com, pentru NT este cmd.exe iar echivalentul cu interfata grafica este explorer.exe. Pentru sistemele de operare de tip UNIX exista mai multe tipuri de shell cum ar fi Bourne Shell, Bourne Again Shell, Z Shell, C Shell, Korn shell, etc. Pentru detalii suplimentare despre conceptul de shell studiati

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu http://en.wikipedia.org/wiki/Operating_system_shell http://en.wikipedia.org/wiki/Unix_shell Multe din proprietatile shell-ului sunt utilizate cu succes in limbaje de programare precum Perl, Ruby sau Python. Pentru a identifica ce shell utilizati dumneavoastra in terminal incercati comanda : echo $0. 1.2 Bash Bash reia o mare parte din shell-ul original Linux (Bourne Shell) si integreaza numeroase ameliorari provenite din shell-urile Ksh si Csh. Acest program este cu acces gratuit si a fost portat sub Windows . Mediul care a permis portarea sub Windows se numeste Cygwin. Consultati pagina de manual a limbajului de comenzi Bash. Fisierul /etc/passwd contine informatii despre utilizatorii calculatorului dumneavoastra, in special puteti descoperi shell-ul fiecarui utilizator : ovidiu:x:280:1000:ovidiu:/home/ovidiu:/bin/bash Shell-urile disponibile pe calculatorul dumneavoastra pot fi gasite in directorul /bin . Orice shell are in compunerea denumirii sale literele sh . Descoperiti shell-urile disponibile pe calculatorul dumneavoastra !

2. Primul Script Shell Unix


Un script shell este de fapt un fisier text care contine comenzi care pot fi intelese de catre interpretorul dumneavoastra de comenzi. Aceasta lista de comenzi poate fi o lista in adevaratul sens al cuvantului, sau poate fi o combinatie de instructiuni specifice, variabile si bineinteles comenzi UNIX. Exemplu de script shell sub format de lista simpla #!/bin/bash clear ls -l echo Ati 'curatat' ecranul si apoi ati expus continutul de fisiere si directoare al directorului curent Dupa cum se poate vedea in exemplul de mai sus, scriptul nu contine decat trei comenzi aflate fiecare pe cate un rand din scriptul de mai sus.

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu

Exemplu de script shell care contine instructiuni, variabile si comenzi UNIX #!/bin/bash a=0 k=1 for i in `ls` do if [ -f $i ] then cat $i a=`expr $a + $k` fi done echo "Sunt $a fisiere" In exemplul de mai sus se face o afisare a tuturor fisierelor din directorul curent, dupa care se face afisarea numarului de fisiere. Apar variabile cum ar fi a, i si k. Apar de asemeni instructiuni : if, for, dar si comenzi uzuale unix : echo, cat, ls. Dupa expunerea de mai sus, care a avut drept scop familiarizarea cu notiunea de script shell, in continuare va fi expus fluxul care descrie cum se creeaza si se ruleaza un asemenea script. 1. Deschideti un editor preferat, in care veti scrie un fisier numit HelloWorld.sh . Numele oricarui fisier ce contine un script shell este compus din numele pe care-l intentionati la care se adauga extensia .sh . 2. Prima linie cu care va trebui sa inceapa acest fisier este : #!/bin/bash Rolul acetei linii este de a indica faptul ca acest fisier nu este unul obisnuit, ci este unul care contine un script care poate fi interpretat de catre shell-ul specificat. 3. Specificati continutul fisierului dumneavoastra. In cazul de fata nu trebuie decat singura linie : echo 'HelloWorld ! ' 4. Salvati fisierul astfel creat. 5. Acordati dreptul de executare fisierului astfel creat : $ chmod +x HelloWorld.sh 6. Executati scriptul astfel creat : $ ./HelloWorld.sh Mai jos este prezentat un mod simplu de creare si rulare a scriptului de mai sus :

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu $ cat -> HelloWorld.sh #!/usr/bin/bash echo 'HelloWorld !' $ chmod +x Helloworld.sh $ ./HelloWorld.sh HelloWorld ! O remarca importanta se refera la comentariile pentru scripturile shell. Acestea se pot introduce oriunde in textul sursa al scriptului. Comentariile se introduc cu ajutorul simbolului diez #. Ele se pot introduce fie pe linie noua, fie ca ultimul sir de caractere dintr-o linie de cod. Exemple : #!/bin/bash echo Hello! #acesta este un comentariu #!/bin/bash echo Hello! # acesta este alt comentariu
#!/bin/bash echo Hello! # acesta nu este un comentariu bun deoarece instructiunea de pe acelasi rand este ignorata $a=ls

In continuare gasiti cateva exemple de scripturi shell formate dintr-o succesiune de comenzi. Testati aceste scripturi ! #!/bin/bash clear echo -n Dumneavoastra utilizati un sistem uname echo echo -n Versiunea kernelului dumneavoastra este uname -r

3. Variabile si operatii
3.1 Declararea si utilizarea variabilelor Spre deosebire de alte limbaje de programare, cum ar fi C/C++ sau Java, in scripturile shell nu este nevoie de declararea explicita a variabillelor. Pur si simplu efectuati o atribuire acolo unde este necesar si folositi aceasta variabila acolo unde se cere. Atribuirea unei valori se face utilizand o constructie de tipul urmator : variabila = valoare Orice variabila este folosita mai departe prefixand numele variabilei de simbolul $ (dolar) .

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu Exemplu : a=1 echo Am gasit $a fisiere speciale Acest script va afisa la terminal : Am gasit 1 fisiere speciale Asupra numelor de variabile este important sa se tina cont de urmatoarele constrangeri : numele unei variabile nu are voie sa contina caractere speciale; numele unei variabile nu are voie sa contina pe prima pozitie o cifra; lungimea numelui unei variabile este nelimitata; 3.2 Operatii si operatori aritmetici Pentru a afectua operatii cu variabilele se va utiliza comanda expr. Pentru detalii cititi pagina de manual a comenzii expr. Urmatorul script este justificativ pentru a studia efectul operatorilor aritmetici, respectiv sintaxa lor. #!/bin/bash expr 1 + 2 a=2 expr $a "*" 6 b=5 expr $a "-" $b c= expr $a "*" $b echo "$c"

Intotdeauna accesul la valoarea unei variabile se face cu ajutorul simbolului $ (dolar). Atunci cand dorim sa facem calcule simple cu o anumita variabila este recomandat sa se utilizeze notatia $variabila, deoarece intr-o asemenea situatie este nevoie sa se acceseze valoarea varibilei. La atribuirea de valori unei variabile nu se foloseste simbolul $, deoarece nu trebuie accesata valoarea variabilei, ci trebuie modificat continutul acesteia. Operatiile aritmetice si de compararea pe care le permite spre evaluare comanda expr sunt :

adunare : + scadere : inmultire: * impartire : / restul impartirii : % comparare : > >= < <= != =

Aceasta comanda permite de asemeni lucrul cu expresii complexe, care contin paranteze. Introducerea parantezelor se face cu ajutorul lui \ (slash). Exemplul de mai jos sugereaza cum se poate utiliza aceasta comanda : $ expr \( 5 + 2\) 7

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu

De asemeni aceasta comanda permite cateva operatii cu siruri de caractere : $ expr index "Sisteme de operare" e 5 $ expr length "Sisteme de operare" 18 $ expr substr "Sisteme de operare" 1 7 Sisteme 3.3 Variabile de mediu si utilizarea lor in scripturi Scripturile shell permit folosirea variabilelor de mediu definite de catre sistemul dumneavoastra de operare. Referirea la aceste variabile de mediu se face in mod analog cu referirea variabilelor uzuale, cu ajutorul simbolului $ . Atentie la numele acestora care contine doar majuscule. Principalele variabile de mediu sunt : HOME defineste directorul utilizatorului. PATH defineste calea catre directoarele ce contin programe executabile TERM defineste programul executabil de tip terminal utilizat 3.4 Definirea variabilelor Utilizatorul poate defini propriile sale variabile de mediu. Problema care se pune este legata de scopul de a defini noi variabile de mediu.

4. Citirea unei valori si stocarea ei intr-o variabila


Cu scopul de a crea programe interactive care permit citirea de date introduse de catre utilizator a fost introdusa comanda read. Acesta comanda are sintaxa urmatoare : read nume_variabila Efectul comenzii este de a citi ceea ce introduce utilizatorul si de a atribui variabile nume_variabila valoarea citita. Exemplul urmator arata functionarea acestei comenzi : $ read variabila 5 $ echo $variabila 5 $ read nume prenume Aritoni Ovidiu $ echo "Numele dumneavoastra este $nume $prenume" Numele dumneavoastra este Aritoni Ovidiu

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu 5. Structuri condiionale 5.1 Teste IF Pentru a executa o instructiune doar atunci cand este indeplinita o conditie se utilizeaza comnada if. Sintaxa acestei comenzi este : if [ conditie ]; then instructiune (grup de instructiuni) fi Exemplu #!/bin/bash echo "Introduceti varsta dumneavoastra :" read varsta if [ $varsta -ge 18 ]; then echo "Sunteti o persoana cu drept de vot" echo " ! " fi 5.2 Else, elif Pentru a introduce alternative la testele IF se utilizeaza else. Similarul lui else if (conditie) din limbajele de programare este elif. Exemplu #!/bin/bash echo "Introduceti varsta dumneavoastra :" read varsta if [ $varsta -ge 18 ]; then echo "Sunteti o persoana cu drept de vot" echo " ! " else echo "Nu aveti drept de vot" fi Urmatorul exemplu este justificativ pentru elif :

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu #!/bin/bash echo "Introduceti varsta dumneavoastra :" read varsta if [ $varsta -ge 18 ]; then echo "Sunteti o persoana cu drept de vot" echo " ! " elif [ $varsta -ge 14 ]; then echo "Nu aveti drept de vot,dar aveti carte de identitate" fi 5.3 Mai multe conditii Testul if poate testa mai multe conditii . Acestea pot sa fie in relatie de : conjunctie : [ conditia1 ] && [ conditia2 ] disjunctie : [ conditia1 ] || [ conditia2 ] Pentru clarificare studiati exemplele de mai jos : #!/bin/bash echo "Introduceti varsta dumneavoastra :" read varsta if [ $varsta -le 0 ] || [ $varsta -ge 100 ]; then echo "Ati introdus o varsta incorecta !" elif [ $varsta -ge 18 ]; then echo "Sunteti o persoana cu drept de vot" echo " ! " elif [ $varsta -ge 14 ]; then echo "Nu aveti drept de vot,dar aveti carte de identitate" fi 5.4 Operatori de comparare Operator -e fisier -d fisier -f fisier -L fisier -r fisier Descriere Operatori asupra fisierelor Adevarat daca fisier exista Adevarat daca fisier este director Adevarat daca fisier este fisier Adevarat daca fisier este legatura simbolica Adevarat daca fisier are permisiunea de citire [ -e /etc/shadow ] [ -d /home/ Desktop ] [ -f fisier] [ -L /home ] [ -r fis.txt ] Exemplu

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu Operator -w fisier -x fisier Descriere Adevarat daca fisier are permisiunea de scriere Adevarat daca fisier are permisiunea de executare Exemplu [ -w fis.txt ] [ -x script1.sh ] [ fis1 -nt fis2] [ fis1 -ot fis2]

fisier1 -nt fisier2 Adevarat daca fisier1 este mai nou decat fisier2 fisier1 -ot fisier2 Adevarat daca fisier1 este mai vechi decat fisier2 -z sir -n sir sir1=sir2 sir1!= sir2 nr1 -eq nr2 nr1 -ne nr2 nr1 -lt nr2 nr1 -le nr2 nr1 -gt nr2 nr1 -ge nr2 Adevarat daca sir este vid. Adevarat daca sir nu este vid. Adevarat daca sir1 este egal cu sir2 . Adevarat daca sir1 este diferit de sir2 . egalitate inegalitate < <= > >=

Operatori asupra sirurilor de caractere [ -z $var ] [ -n $var ] [ $sir1 = $sir2 ] [ $sir1 != $sir2 ] [ $a -eq 15] [ $a -ne 15] [ $a -lt 15] [ $a -le 15] [ $a -gt 15] [ $a -ge 15]

Operatori de comparare numerica

Negarea unei conditii se face cu ajutorul lui ! . #!/bin/bash if [ ! -d /folder ]; then mkdir /folder fi

5.5 Case Similarul instructiunii case din linbajele de programare este case. Acesta are sintaxa : case $variabilaOptiune in multimea1) instructiuni1 ;; multimea2) instructiuni2 ;; multimea3) instructiuni3 ;; ............................................. multimean) instructiunin ;; *) instructiuniDEFAULT ;; esac Variabila dupa care se exprima optiunea poate sa fie intr-o anumita multime. Aceasta multime poate avea un singur element, de exemplu :

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu case $x 1) echo Optiunea 1 ! ;; ....... De asemeni multimea poate fi o multime de numere sau litere, sau alte elemente : case $x [ 0-9 ]) echo Numere naturale cu o singura cifra ! ;; [ 10-99 ]) echo Numere naturale cu dou cifre ! ;; *) echo Alte numere ! ;; esac case $x [ am, nam, bam ] : echo $x ; ........................... esac Exemple #!/bin/bash echo "Care este sistemul de operare preferat ?" echo " 1- Windows 2-Linux 3-Mac OS 4-Altul " read optiune case "$optiune" in 1) echo "Sistemul dumneavoastra este Windows !";; 2) echo "Sistemul dumneavoastra este Linux !";; 3) echo "Sistemul dumneavoastra este Mac OS !";; 4) echo "Sistemul dumneavoastra este Altul !";; *) echo "Introduceti va rog un numar cuprins intre 1 si 4 inclusiv !";; esac #!/bin/bash case "$year" in [0-9][0-9]) year=19${year} years=`expr $year - 1901` ;; [0-9][0-9][0-9][0-9]) years=`expr $year - 1901` ;; *) echo 1>&2 Year \"$year\" out of range ... exit 127 ;; esac

5.6 Select Instructiuna select este o extensie a instructiunii case. Spre deosebire de case, lista de valori posibile

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu pentru care se poate face o optiune este specificata la inceputul instructiunii. In plus aceasta instructiune asigura un tratament unitar pentru oricare dintre optiunile alese . Un merit deosebit este acela ca instructiunea permite crearea de meniuri in mod automat. Pentru detalii studiati exemplul urmator : #!/bin/bash echo "Care este sistemul de operare preferat ?" select optiune in "Windows" "Linux" "BSD" "MAc Os" "MS DOS" do echo "Sistemul dumneavoastra este $optiune ." break done $ ./scriptSELECT.sh Care este sistemul de operare preferat ? 1) Windows 2) Linux 3) BSD 4) MAc Os 5) MS DOS #? 3 Sistemul dumneavoastra este BSD . 6. Structuri repetitive Structurile repetitive sunt similare celor din limbajele de programare : for, while, until. O structura repetitiva este utilizata intr-un program daca : se doreste introducerea unei informatii corecte de catre utilizator. In acest caz structura repetitiva va cere introducerea acelei informatii pana cand ea este corecta. se doreste repetarea unei anumite actiune de un numar bine stabilit sau nu de ori. Atunci cand se doreste repetarea unei anumite instructiuni de un numar fix de ori se utilizeaza instructiunea for, iar cand numarul nu este fixat se utilizeaza instructiunile while respectiv do-until. In definirea unui ciclu repetitiv se utilizeaza trei criterii : o valoare initiala, de pornire. o conditie de iesire sau de iesire. o incrementare a valorii de pornire. 6.1 Structura repetitiva while While se utilizeaza pentru a executa o anumita instructiune atata timp cat este verificata o anumita conditie. Sintaxa : while [ conditie ] ; do intstructiuni done

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu

Exemple 1. Exemplul urmator calculeaza suma numerelor introduse de catre utilizator atata timp cat numerele introduse sunt mai mici sau egale decat 10 : #!/bin/bash read x s=0 while [ $x -le 10 ]; do s=`expr $s + $x` read x done echo "Suma este $s" 2. Exemplul urmator numara de cate ori a fost introdusa optiunea DA. Ciclul while se opreste la introducerea altui sir de caractere diferit de DA. #!/bin/bash read r u=1 x=0 while [ "$r" = "DA" ] do x=` expr $x + $u ` read r done echo "Contorizarea = $x"

6.2 Structura repetitiva until Until inseamna pana cand , ceea ce inaseamna ca ciclul se va repeta pana cand conditia specificata va fi indeplinita. Sintaxa comenzii este : until [ conditie_care_trebuie_indeplinita ] do instructiuni done Exemple 1. Scriptul urmator are acelasi efect cu exemplul 1 explicat in cadrul ciclului while.

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu #!/bin/bash read x s=0 until [ $x -ge 10 ]; do s=`expr $s + $x` read x done echo "Suma este $s" 2. Scriptul urmator are acelasi efect cu exemplul 1 explicat in cadrul ciclului while. #!/bin/bash read r u=1 x=0 until [ "$r" != "DA" ] do x=` expr $x + $u ` read r done echo "Contorizarea = $x"

6.3 Structura repetitiva for Structura repetitiva for este utilizata atunci cand se doreste repetarea unei anumite instructiuni sau bloc de instructiuni de numar bine precizat de ori. Sintaxa acestei instructiuni este : for contor in multime do instructiuni done Exemple 1. Exemplul urmator calculeaza suma primelor 10 numere naturale : #!/bin/bash s=0 for i in 1 2 3 4 5 6 7 8 9 10 do s=`expr $s +$i` done echo Suma primelor 10 numere este 2. Exemplul urmator calculeaza suma primelor 100 de numere naturale .

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu

Remarcati ca in acest script shell este utilizata comanda seq. Aceasta comanda construieste o secventa de numere. De exemplu seq 100 , creeaza o secventa care contine primele 100 de numere naturale. Comanda seq 41 56 creeaza o secventa de numere ce contine toate numerele cuprinse intre 41 si 56, inclusiv extremitatile 41 respectiv 56. O optiune importanta pe care o are aceasta comanda este de a permite construirea de secvente de numere construite prin incrementare . De exemplu comanda seq 1 3 100 permite afisarea de numere de la 1 la 100 din 3 in 3, incepand cu 1. Cititi pagina de manual a comenzii seq si rulati cele cateva exemple de mai sus pentru o mai buna intelegere a acestei comenzi. #!/bin/bash s=0 for i in `seq 100` do s=`expr $s + $i` done echo "Suma primelor 100 de numere este $s" 3. Exemplul urmator calculeaza dimensiunea totala a tuturor fisierelor si directoarelor din directorul curent de lucru. #!/bin/bash s=0 for i in `ls -l |tr -s ' ' | cut -d ' ' -f5` do s=`expr $s + $i ` done echo "Dimesniunea totala a fisierlor este $s biti"

7. Transmiterea parametrilor
Orice comanda UNIX se apeleaza prin numele sau urmat de anumite optiuni si de parametri. De exemplu comanda de copiere a unui fisier fis.txt intr-un director DirectorA este : cp fis.txt DirectorA 0 1 2 0 : comanda 1 : parametrul 1 2 : parametrul 2 Parametrii se utilizeaza pentru a nu cere introducerea de date suplimentare de catre utilizator dupa lansarea procesului care efectueaza o anumita comanda, in felul acesta asigurandu-se o atomicitate a procesului si continuitate.

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu

Este asadar recomandabil sa se utilizeze pe cat posibil scripturi care utilizeaza tehnica transmiterii de parametri. Pentru a pasa un parametru unui script shell se procedeaza analog cu parmetrarea comenziilor UNIX : numele_scriptului parametru1 parametru2 ... Acesti parametrii pot fi referentiati in cadrul programului scriptului cu ajutorul unor variabile speciale dupa cum urmeaza : $1 la $9 : contine al X-lea parametru $* : contine toti parametrii $# : contine numarul de parametri transmisi $0 : contine numele scriptului $$ : contine numarul procesului shell care trateaza scriptul dumneavoastra Pentru clarificarea notiunilor prezentate testati urmatorul script : #!/bin/bash echo "Ati transmis $# parametrii dupa cum urmeaza : " echo "Parametrul 1 : $1" echo "Parametrul 1 : $2" echo "Parametrul 1 : $3" echo "Parametrul 1 : $4" echo "Putem afisa toti parametrii printr-un singur apel : $* " Apeland acest program se obtine : $ ./parametri.sh a b c d Ati transmis 4 parametrii dupa cum urmeaza : Parametrul 1 : a Parametrul 1 : b Parametrul 1 : c Parametrul 1 : d Putem afisa toti parametrii printr-un singur apel : a b c d

8. Redirectari
Iesirea standard a orciarei comenzi UNIX este ecranul. In anumite situatii este necesar ca iesirea unei comenzi, adica raspunsul ei, sa fie utilizat ca si parametru pentru o alta comanda. Pentru a utiliza iesirea unei anumite instructiuni ca si parametru se utilizeaza tehnica redirectarii asupra careia se concentreaza acest paragraf. 8.1 Comanda1 | Comanda2 Fenomenul descris printr-o inlantuire ca cea exprimata in titlul acestui paragraf poate fi sintetizat intr-un singur cuvant : PIPE. Un fisier in care un proces poate scrie, iar un alt proces poate citi se numeste fisier de tip PIPE. Pentru executia unei comenzi shell in marea majoritate a cazurilor se creeaza un proces care va executa cerintele acelei comenzi. Atunci cand dorim ca procesul creat

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu pentru a rezolva o anumita comanda, sa transmita rezultatele lui unui alt proces se creeaza un fisier PIPE in care un proces va scrie date iar altul le va citi. Exemplu : Linia cat fisier.txt | wc -l creeaza doua procese. Primul proces trateaza comanda de afisare a fisierului fisier.txt. Rezultatele afisarii vor fi depuse in fisierul PIPE creat si simbolizat prin | (linie verticala) . Comanda wc -l , va fi tratata printr-un alt proces care va citi datele din fisierul PIPE creat, numarand liniile care se afla scrise in fiserul PIPE .

8.2 Comanda1 `Comanda2` Aceasta redirectare permite transmiterea de parametri comenzii Comanda1 rezultatele obtinute in urma executarii comenzii Comanda2 . Este procesul invers fenomenului de pipe explicat anterior. Exemplul urmator este justificativ pentru acest tip de redirectare. Mai jos se poate analiza un mod de a tipari continutul tuturor fisierelor dintr-un anumit director : $ cat `ls` .... Continutul tuturor fisierelor

8.3 Redirectarea iesirii Rezultatele unei comenzi constituie iesirea acelei comenzi. Redirectarea rezultatelor se poate face fie catre un fisier fie catre o alta iesire. Modalitatea de a redirecta iesirea unei comenzi este de a utiliza simbolul dupa numele comenzii a carui rezultat doriti sa il redirectati : comanda > altOutput Daca se realizeaza redirectarea cu ajutorul lui > intr-un fisier atunci acest fisier va fi creat chiar daca el nu exista. Daca fisierul exista deja pe disc atunci continutul acestuia va fi inlocuit complet de output-ul comenzii anterioare. Daca se doreste sa se inscrie in fisier la sfarsitul lui atunci se va folosi >> . Pentru detalii studiati exemplele urmatoare : Exemple $ echo Buna! > helloworld.txt # scrie in fisierul helloworld.txt $ cat helloworld.txt Buna ! $ echo 'Buna Ziua!' >> hello.txt # scrie Buna Ziua! la sfarsitul fisierului helloworld.txt $ cat helloworld.txt Buna! Buna Ziua!

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu 8.4 Redirectarea erorilor 2> Pentru a evita afisarea tuturor mesajelor de eroare la terminalul standard este adesea util sa afisam aceste mesaje intr-un anumit fisier text. Astfel aceste mesaje pot fi studiate si ulterior, proces care este deosebit de util. $ mkdir TestRedirectareErori $ cd TestRedirectareErori :~/TestRedirectareErori$ echo 'A B C' | xargs mkdir :~/TestRedirectareErori$ man ls > ls.txt Reformatting ls(1), please wait... :~/TestRedirectareErori$ man cat > cat.txt Reformatting cat(1), please wait... :~/TestRedirectareErori$ ls A B C cat.txt ls.txt :~/TestRedirectareErori$ cat `ls` 2> erori.txt CAT(1) User Commands

CAT(1)

NAME cat - concatenate files and print on the standard output SYNOPSIS cat [OPTION] [FILE]... ..................................................................................................... Urmeaza continutul celor doua fisiere ls.txt si cat.txt . :~/TestRedirectareErori$ cat erori.txt cat: A: Is a directory cat: B: Is a directory cat: C: Is a directory

Programul urmator arata cum se poate scrie la cele doua iesirii standard : stdout si stderr .
#include <stdio.h> int main() { fprintf(stdout,"message on stdout\n"); fprintf(stderr,"message on stderr\n"); fprintf(stdout,"2nd message on stdout\n"); return 0; }

Creati un fisier redirectari.c care va contine programul sursa de mai sus. Compilati si rulati programul de mai sus. Pentru a pune in evidenta mesajele de tip eroare redirctati stderr spre un fisier numit erori.txt .

[LABORATOR DE SISTEME DE OPERARE 1] Aritoni Ovidiu :~/Lab5$ gcc redirectari.c :~/Lab5$ ./a.out message on stdout message on stderr 2nd message on stdout :~/Lab5$ ./a.out 2>erori.txt message on stdout 2nd message on stdout :~/Lab5$ cat erori.txt message on stderr :~/Lab5$

9. Functii
Ca majoritatea limbajelor de programare si scripturile shell pot contine functii ce sunt definite in interiorul acestora si care pot fi apelate ulterior. Declararea unei functii se face urmand sintaxa : function nume( ) { } Apelul unei functii se face prin numele sau. Unei functii i se pot transmite anumiti parametri ca unui script shell .

10.Referinte WEB