Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Informatica


Index » educatie » Informatica
» Fisiere de comenzi


Fisiere de comenzi


Fisiere de comenzi

1. Scopul lucrarii

Lucrarea de fata prezinta caracteristicile interpretorului de comenzi, numit in Unix shell.

Shell-ul reprezinta in acelasi timp limbajul de comanda al sistemului de operare Unix si un limbaj de programare.

Ca limbaj de comanda shell-ul reprezinta interfata dintre utilizator si sistemul de operare. Se permite definirea unor comenzi complexe cu ajutorul comenzilor elementare, ceea ce permite extinderea mediului de operare existent.

Ca limbaj de programare sunt introduse notiunile de variabila, parametru, functie si structuri de control specifice limbajelor algoritmice.



2. Consideratii teoretice

2.1. Comenzi shell

O comanda transmisa shell-ului pentru interpretare are formatul:

command arguments

unde command este numele programului care se executa si arguments argumentele sale. Mai multe comenzi scrise pe o linie trebuie separate prin " ; ". Orice comanda executata intoarce un numar ce indica starea de iesire din comanda. in Unix conventia este 0 pentru o comanda executata cu succes si diferit de 0 in caz de esec.

Comenzile pot fi conectate prin pipe ( simbolul |) astfel incat iesirea unei comenzi constituie intrare pentru a doua. in acest caz starea de iesire este a ultimei comenzi din pipe. De exemplu:

ls -l | more

aplica filtrul more pe rezultatul comenzii ls.

Daca secventa de comenzi este terminata cu ampersand (&), ele se executa asincron in background. Shell-ul afiseaza identificatorul procesului lansat.

Continuarea unei comenzi pe linia urmatoare este posibila daca linia este terminata cu backslash ().

Caracterele && executa comanda de dupa ele daca precedenta comanda a fost executata cu succes. In caz contrar se pot folosi caracterele ||. De exemplu:

who | grep 'adi' > /dev/null && echo 'adi's logged on'

O linie shell ce incepe cu # este considerata comentariu.

2.2. Variabile shell

Variabilele shell pot fi: variabile utilizator, parametri pozitionali si variabile predefinite si speciale. Variabile utilizator sunt definite prin:

var1=val1 var2=val2

Continutul variabilei poate fi accesat prin prefixarea numelui variabilei cu caracterul $. De exemplu:

loc=/usr/acct/adi

cd $loc

Variabilele utilizator sunt evaluate la valoarea lor, in afara cazului in care valoarea este delimitata de apostrofuri.

Numele unei variabile nu este permis sa fie egal cu numele unei functii. Daca se doreste definirea unei variabile noi prin concatenare unui nume de variabile cu un sir de caractere fix, numele variabilei trebuie delimitat de caracterele . De exemplu:

$ num=3

$ k=$tmp

$ echo $k

3tmp

Shell-ul ofera un mecanism de substitutie bazat pe urmatoarele caractere:

'' Nici un caracter delimitat intre apostrofuri nu are semnificatie speciala.

'' Nici un caracter delimitat de ghilimele nu are semnificatie speciala cu exceptia: $, ` si .

c Nu interpreteaza caracterul c. Intre ghilimele este caracter de evitare pentru: $, `, ' si . In alte cazuri este ignorat.

`cmd` Executa comanda cmd. De exemplu: $ rep=`pwd` atribuie variabilei rep rezultatul comenzii pwd.

La intrarea in sistem fiecare utilizator are o copie a programului shell. Acest shell pastreaza un mediu distinct pentru fiecare utilizator din sistem. De exemplu:

$ cat test

x=50

echo :$x:

$ x=100

$ test

:50:

$ echo $x

100

Acest exemplu demonstreaza ca mediul shell-ului initial contine variabila x ce are valoarea 100 si care nu este modificata la 50 de catre programul shell test. Explicatia este simpla, deoarece shell-ul initial lanseaza un subshell pentru executia programului test, fiecare shell avand propria variabila x.

Pentru a face cunoscuta o variabila unui subshell se foloseste comanda export. De exemplu:

$ y=10

$ cat test1

echo x = $x

echo y = $y

$ export y

$ test1

x =

y = 10

$

1. Orice variabila care nu este exportata este locala si nu este cunoscuta subshell-ului.

2. Variabilele exportate si valorile lor sunt copiate in mediul subshell-ului, unde pot fi accesate si modificate. Efectul modificari nu este vizibil in shell-ul parinte.

3. Daca un subshell exporta explicit o variabila a carei valoare a modificat-o ea se transmite. Daca subshell-ul nu exporta explicit o variabila a carei valoare a modificat-o modificarea afecteaza doar variabila locala, indiferent daca variabila a fost exportata de shell-ul parinte.

4. O variabila poate fi exportata inainte sau dupa atribuirea unei valori.

Parametri pozitionali

Parametrii pozitionali $1, $9 sunt argumentele din linia de comanda, iar $0 este numele programului shell ce se executa. Parametrii pozitionali pot fi actualizati prin comanda set.

Variabile predefinite si speciale

Exista un numar de variabile predefinite folosite de interpretor sau de programele de deschidere a sesiunii. Acestea sunt:

$CDPATH - Desemneaza caile suplimentare de cautare la executia comenzii cd cu argument incomplet specificat.

$HOME - Desemneaza directorul implicit pentru comanda cd.

$PATH - Defineste lista directoarelor parcurse de shell in cautarea unui fisier executabil corespunzator comenzii introduse (directoarele sunt separate prin :).

$IFS - Multimea caracterelor separatoare (blanc (040), t (011), n (012)), folosite de shell la analiza liniei de comanda.

$MAIL - Indica numele unui fisier pe care shell-ul il verifica pentru sosirea mail.

$PS1 - Defineste prompterul shell, implicit $.

$PS2 - Defineste prompterul liniilor de continuare, implicit >.

$SHELL - Indica numele shell-ului curent.

Shell-ul atribuie valori implicite variabilelor: IFS, PATH, PS1, Ps2 la intrarea in sesiune. Programul login initializeaza cu valori implicite variabilele HOME si MAIL.

Variabilele speciale sunt read-only:

$# - numarul argumentelor din linia de comanda (exclusiv $0).

$* - argumentele $1, $2,, $9 concatenate.

$@ - argumentele $1, $2,$9 separate.

$? - starea de iesire a ultimei comenzi executate.

$$ - identificatorul de proces asociat shell-ului.

$- - flagurile actuale ale shell-ului pozitionate prin set.

$! - identificatorul ultimului proces lansat in background.

2.3. Programe (proceduri) shell

Posibilitatea de a construi proceduri alcatuite din comenzi ale sistemului de operare constituie una din principalele facilitati puse la dispozitie de catre shell.

Interpretorul permite executia unor fisiere de comenzi tratate ca proceduri shell. Apelul unei proceduri este identic cu al unei comenzi:

$procedura arg1 arg2 argn

Procedura corespunde unui fisier de comenzi. Transmiterea parametrilor unei proceduri se face prin valoare. Apelul unei proceduri shell genereaza un proces shell fiu pentru citirea si executia comenzilor. Executia unui fisier de comenzi se face prin:

$ sh fis_com [ parametrii] sau

$ fis_com [ parametrii]

Forma a doua daca fisierul desemnat, fis_com, are pozitionat bitul de executie din drepturile de acces ( comanda chmod u+x fis_com).

Parametrilor actuali specificati in linia de apel le corespund parametrii formali $1, $2, $9 din interiorul procedurii. Numele fisierului de comenzi este referit in interior acesteia prin $0.

Procedurile shell pot fi apelate recursiv.

2.4. Functii si comenzi incorporate in shell

Incepand cu versiunea 2 din Unix System V in programe shell se pot defini functii. Formatul general pentru definirea unei functii este:

func_name()

unde func_name este numele functiei, parantezele marcheaza definirea functiei, iar intre acolade este specificat corpul functiei. Se impune ca prima comanda sa fie separata de acolada cu un blanc, iar ultima comanda sa fie terminata cu caracterul ';' daca acolada se afla pe aceeasi linie cu comanda. De regula, daca un utilizator si-a definit mai multe functii intr-un fisier, myfuncs, el poate face cunoscut shell-ului curent aceste functii prin:

. myfuncs

De exemplu, o functie utila este cea de schimbare a directorului curent. Aceasta se bucura de proprietatea ca ea se executa in mediul curent. Definitia ei, continuta in fisierul myfuncs, este:

mycd()

Pentru a ilustra folosirea acestei functii se poate folosi secventa de comenzi:

$ . myfuncs

$ pwd

/root/adi

$ mycd /home/gabi

$ pwd

/home/gabi

$ mycd -

/root/adi

Comparativ executia unei functii este mai rapida decat a unui program shell echivalent, deoarece shell-ul nu necesita cautarea programului pe disc, deschiderea fisierul si incarcarea continutul sau in memorie.

Stergerea unei definitii de functii este similara cu stergerea unei variabile. Se foloseste comanda unset func_name.

Comenzile incorporate in shell pot fi apelate direct in programele shell. Lista si efectul lor este prezentat in cele ce urmeaza.

: Comanda fara efect.

. file Se citesc si se executa comenzile din fisierul file in mediul curent. Shell foloseste variabila PATH pentru cautarea fisierului file. Fisierul nu trebuie sa fie executabil.

break [n] Comanda de parasire a celei mai interioare bucle for, while sau until ce contine break. Daca n este specificat se iese din n bucle. De exemplu:

while true

do

cmd=`getcmd`

if [ '$cmd' = quit ]

then break

else processcmd '$cmd'

fi

done

cd [dir] Schimba directorul curent la cel specificat. Directorul curent este parte a mediului curent. Din acest motiv la executia unei comenzi cd dintr-un subshell doar directorul curent al subshell-ului este modificat. Exista variabila $CDPATH (Unix System V), care permite cautari suplimentare pentru comanda cd. De exemplu:

$ echo $CDPATH

:/usr/adi:/usr/adi/lab

$ cd l1

/usr/adi/lab/l1 # avand in vedere ca l1 este subdirector pentru ultima cale.

continue [n] Comanda permite trecerea la o noua iteratie a buclei for, while sau until. De exemplu:

for file

do

if [ ! -f '$file' ]

then

echo '$file not found'

continue

fi

# prelucrarea fisierului

done

echo [-n][arg] Comanda de afisare a argumentelor la iesirea standard. Daca optiunea -n este specificata caracterul 'n' nu este scris la iesirea standard. De exemplu:

$ echo 'XtY'

X Y

eval cmd Evalueaza o comanda si o executa. De exemplu:

$ x='ab cd'

$ y='$x'

$ echo $y

$x

$ eval echo $y

ab cd

Se observa ca eval parcurge lista de argumente de doua ori: la transmiterea argumentelor spre eval si la executia comenzii. Lucrul acesta este ilustrat de exemplul:

$ pipe='|'

$ ls $pipe wc -l

| not found

wc not found

-l not found

Rezultatul dorit se obtine prin:

$ eval ls $pipe wc -l

5

Comanda eval este folosita in programe shell care construiesc linii de comanda din mai multe variabile. Comanda e utila daca variabilele contin caractere care trebuie sa fie recunoscute de shell nu ca rezultat al unei substitutii. Astfel de caractere sunt: ;, |, &, < , >, '.

exec prg Executa programul, prg, specificat. Programul lansat in executie inlocuieste programul curent. Daca exec are ca argument redirectarea I/E shell-ul va avea I/E redirectate. De exemplu:

# contorizeaza numarul de linii dintr-un fisier

file=$1

count=0

exec < $file

while read line

do

count=`expr $count + 1`

done

echo $count

exit [(n)] Cauzeaza terminarea shell-ului curent cu cod de iesire egal cu n. Daca n este omis, codul de iesire este cel al ultimei comenzi executate.

export [v] Marcheaza v ca nume de variabila exportata pentru mediul comenzilor executate secvential (pentru subshell). Daca nu este precizat nici un argument se afiseaza o lista cu toate numele exportate in acest shell. Numele de functii nu poate fi exportat.

getopts opt v Comanda este folosita la prelucrarea optiunilor din linia de comanda. Se executa, de regula, in bucle. La fiecare iteratie getopts inspecteaza urmatorul argument din linia de comanda si decide daca este o optiune valida sau nu. Decizia impune ca orice optiune sa inceapa cu caracterul '-' si sa fie urmata de o litera precizata in opt. Daca optiunea exista si este corect precizata, ea este memorata in variabila v si comanda returneaza zero. Daca litera nu este printre optiunile precizate in opt, comanda memoreaza in v un semn de intrebare si returneaza zero cu afisarea unui mesaj de eroare la standardul de eroare.

In cazul in care argumentele din linia de comanda au fost epuizate sau urmatorul argument nu incepe cu caracterul '-' comanda returneaza o valoare diferita de zero.

De exemplu, pentru ca getopts sa recunoasca optiunile -a si -b pentru o comanda oarecare, cmd, apelul este:

getopts ab var

Comanda cmd se poate apela:

cmd -a -b sau cmd -ab

In cazul in care optiunea impune un argument suplimentar acesta trebuie separat de optiune printr-un blanc. Pentru a indica comenzii getopts ca urmeaza un argument dupa o optiune, litera optiunii trebuie postfixata cu caracterul ':'. De exemplu, daca optiunea b, din exemplul anterior, ar necesita un argument:

getopts ab: var

Daca getopts nu gaseste dupa optiunea b argumentul in variabila var se memoreaza un semn de intrebare si se va afisa un mesaj de eroare la iesirea standard.

In caz ca argumentul exista el este memorat intr-o variabila speciala OPTARG. O alta variabila speciala, OPTIND, este folosita de comanda pentru a preciza numarul de argumente prelucrate. Valoarea ei initiala este 1.

hash [-r][cmd] Permite cautarea unor comenzi si memorarea locului unde se gasesc acestea in structura arborescenta de fisiere. Daca argumentul lipseste sunt afisate toate comenzile memorate. Daca optiunea -n este specificata se sterg comenzile memorate.

pwd Cauzeaza afisarea directorului curent.

read [v] Se citeste o linie din fisierul standard de intrare si se atribuie cuvintele citite variabilelor v (daca IFS nu a fost redefinita). De exemplu:

$ IFS=:

$ read x y z

123:345:678

$ echo $x

123

readonly [v]

Identica cu read, dar valoarea variabilei v nu poate fi schimbata prin atribuiri ulterioare. Daca argumentul lipseste se afiseaza variabilele read-only.

return [n] Permite revenire dintr-o functie cu valoarea n. Daca n este omis, codul returnat este cel al ultimei comenzi executate. Valoarea returnata poate fi accesata prin variabila $? si poate fi testata in structurile de control if, while si until. De exemplu:

testare()

# test

. testare # functia se face cunoscuta

testare $1

if [ '$?' = 0 ]

then

echo 'Argumentul e corect'

else

echo 'Argumentul e incorect'

fi

set [--aefhkntuvx] [args]

Comanda permite activarea/inactivarea unor optiuni sau pentru pozitionarea parametrilor pozitionali. Starea curenta se afla in $-. Argumentele ramase sunt atribuite, rand pe rand, la $1, $2,. Daca nu exista argumente, valoarea fiecarei variabile este afisata.

Optiuni:

-v Afiseaza toate liniile programului shell.

-x Afiseaza toate comenziile si argumentele lor pe masura ce sunt executate (prefixate de +). Folosita la depanarea programelor shell.

-e Shell-ul se opreste daca vreo comanda returneaza cod de iesire eronat;

-n Permite testarea programelor shell, fara a le executa. De exemplu:

$ set unu doi trei $ set -vx

$ echo $1:$2:$3 $ set +x

unu:doi:trei

$ echo $#

3

$ echo $*

unu doi trei

shift [n] Deplasare spre dreapta (cu n) a parametrilor.

sleep n suspenda executia pentru n secunde.

test conditie Comanda este echivalenta cu [ conditie ]. Shell-ul evalueaza conditia iar daca rezultatul evaluarii este TRUE se returneaza codul de iesire 0. Conditia poate fi formata din mai multe conditii legate prin operatorii -a (and) si -o (or). Conditiile pot fi delimitate prin paranteze dar gardate de .

times Shell-ul afiseaza timpul ( timp utilizator si timp sistem) consumat de procesele executate de shell. De exemplu:

$ times

2m7s 3m7s

trap cmds sem Shell-ul executa comanda sau comenzile cmds la receptionarea semnalului sem. De exemplu, pentru ca la apasarea tastei Ctr-C ( semalul 2=interrupt) sa se stearga anumite fisiere se foloseste:

$ trap 'rm $TMPFILE; exit' 2

Pentru a ignora un semnal se poate folosi:

$ trap '' 2

Pentru a reseta actiunea atasata unui semnal:

$ trap 2

type cmds Furnizeaza informatii despre comanda sau comenzile cmds. Informatia specifica daca comanda este: o functie, un program shell, o comanda Unix standard. De exemplu:

$ type mycd

mycd is a function

# urmeaza definitia

$ type pwd

pwd is a shell builtin

$ type troff

troff is /usr/bin/troff

unset v Pentru a sterge definirea unei variabile din mediul curent se foloseste comanda unset. De exemplu:

$ x=100

$ echo $x

100

$ unset x

$ echo $x

# variabila x a fost stearsa

$

wait [pid] Asteapta executia procesului pid. Daca pid este omis shell-ul asteapta terminarea tuturor proceselor fiu. De exemplu:

$ sort fisdate > fisdate_sort &

123

$

$ wait 123

$ # prompterul apare la terminarea procesului 123

Pentru a astepta un anume proces se poate folosi variabila $!. De exemplu:

prog1&

pid1=$!

prog2&

pid2=$!

wait $pid1 # se asteapta terminarea procesului pid1

wait $pid2 # se asteapta terminarea procesului pid2

2.5. Structuri de control

Dupa executia unei comenzi se returneaza un cod de revenire, care poate fi testat in structurile de control conditionale. O comanda corect executata intoarce cod de retur zero. O comanda este o secventa de cuvinte separate prin caractere 'b' sau 't'. Primul cuvant specifica comanda ce se executa, iar urmatoarele specifica argumentele comenzii. Valoarea unei comenzi este starea ei de iesire daca executia ei a decurs normal sau 200+stare (octal), daca executia ei sa terminat anormal.

Un lant (pipe) de comenzi este o secventa de una sau mai multe comenzi separate prin caracterul '|'. Iesirea unei comenzi serveste ca intrare pentru urmatoarea. Fiecare comanda este un proces separat, shell-ul asteptand executia ultimei comenzi din lant. Starea unui lant este starea ultimei comenzi din lant.

O lista este o secventa de una sau mai multe lanturi separate prin carcaterele ';', '&' sau && si ||.

Separatorii afecteaza executia astfel:

; Executie secventiala.

& Executie asincrona (backgroaund).

&& Executa urmatoarea lista daca precedentul lant a returnat starea 0.

|| Identic ca &&, dar starea de iesire diferita de 0.

O comanda este o comanda simpla sau una dintre comenzile de mai jos.

a) Structura IF are sintaxa:

if lista_1

then lista

[ elif lista_2

then lista]

[ else lista]

fi

Se executa lista_1; daca codul de retur este zero se executa lista ce urmeaza primului then. In caz contrar, se executa lista_2 si daca codul de retur este zero se executa lista de dupa al doilea then. De exemplu:

if test -f $1

then echo $1 este un fisier ordinar

elif test -d $1

n echo $1 este un director

e echo $1 este necunoscut

i

b) Structura CASE are sintaxa:

case cuvant in

sablon_1) lista;;

sablon_2) lista;;

esac

Se compara cuvant cu fiecare din sabloanele prezente si se executa lista de comenzi unde se constata potrivirea. De exemplu, analiza unei optiuni din linia de comanda se poate face astfel:

case $1 in

-r) echo optiunea r;;

-m) echo optiunea m;;

*) ;;

esac

c) Structura FOR are sintaxa:

for nume [in cuvint ]

do lista

done

Variabila de bucla nume ia pe rand valorile din lista ce urmeaza lui in. Pentru fiecare valoare se executa ciclul for. Daca in cuvint este omis, ciclul se executa pentru fiecare parametru pozitional actualizat. Conditia poate fi si in * , caz in care variabila nume ia pe rand ca valoare numele intrarilor din directorul curent. De exemplu, pentru a copia trei fisiere cu nume similare in directorul /TMP se foloseste secventa:

for $1 in 1 2 3

do cp fis /TMP

done

d) Structura WHILE are sintaxa:

while lista_1

do lista

done

Daca starea de iesire din ultima comanda din lista_1 este zero, se executa lista. In caz contrar, bucla se termina. De exemplu, pentru a vedea daca o persoana este in sesiune se poate folosi secventa::

while ;

do

if who | grep $1 /dev/null

then echo $1 este prezent

exit

else

sleep 120

done

Argumentul buclei while este comanda vida, care returneaza codul 0. Bucla se va executa pana utilizatorul, al carui nume este dat de primul argument al procedurii, este in sesiune.

e) Structura UNTIL are sintaxa:

until lista_1

do lista

done

Ea este similara structurii WHILE, dar se neaga conditia de terminare a testului. De exemplu:

until who | grep $1 dev/null

do

sleep 120

done

echo $1 este prezent

2.6. Redirectarea fisierelor standard

Procesul shell deschide trei fisiere standard ( cu descriptori 0, 1, 2) pentru intrarea, iesirea si iesirea de erori, ce sint atribuite terminalului la care s-a deschis sesiunea respectiva. Aceste fisiere sunt asociate si utilizate intr-o maniera standard de fiecare program. La executia unei comenzi procesul asociat creat de shell mosteneste fisierele deschise, inclusiv cele standard. Acest lucru asigura independenta programelor fata de dispozitivele fizice asociate de interpretor fisierelor standard.

Interpretorul permite insa redirectarea fisierelor standard de intrare/iesire spre alte dispozitive periferice sau fisiere astfel:

< fis fisierul fis este fisierul standard de intrare;

> fis fisierul fis este fisierul standard de iesire;

>>fis fisierul fis este fisierul standard de iesire in

adaugare;

<<fis fisierul standard de intrare este intrarea shell

( citeste pina la linia identica cu fis, sau pina la sfirsit de fisier);

<& nr utilizeaza fisierul cu descriptorul nr ca intrare standard;

>& nr similar dar pentru iesirea standard;

<&- inchide intrarea standard;

>&- inchide iesirea standard.

Exemple:

a) $cat fis > /dev/lp - listeaza fisierul la imprimanta;

b) $cat f1 f2 > f3 - concateneaza fisierele f1 si f2 in f3. Daca fisierul f3 exista deja, prin redirectare cu > vechiul continut este pierdut.

c) $cat f1 f2 >> f3 - daca f3 exista deja, la vechiul sau continut se adauga rezultatul concatenarii fisierului f1 si f2.

d) $mail user1 < scris - trimite utilizatorului user1 o scrisoare aflata in fisierul scris.

e) $echo 'Invalid' >& 2 - scrie mesajul la iesirea standard.

d) $wc -l <<END - executa comanda wc pana la intalnirea linie cu cuvantul 'END'.

>o linie

>inca una

>END

3. Aplicatii

3.1. Fisierul de comenzi de mai jos creeaza un fisier de articole, ce constituie nume de persoane:

echo Creare fisier:

echo Nume fisier[fnnn]: c'

read fname

valid $fname

if test -f invalid

then echo Nume invalid

rm invalid

exit

fi

echo > $fname

aux=0

echo Introduceti articolele:

while read string

case $string in

[a-zA-Z]*);;

*) aux=1;;

esac

test $aux -eq 0

do echo $string >> $fname

done

sort $fname -o $fname

echo Fisierul creat:

echo

cat $fname

Procedura valid:

case $1 in

f[3-5][1-6][1-6][1-6]) ;;

*) echo > invalid;;

esac

3.2. Urmatorul fisier de comenzi afiseaza toate fisierele dintr-un subdirector, citit ca argument din linia de comanda. Fisierul de comenzi se apeleaza astfel:

sh prtr work > /dev/lp0

$cat prtr

echo 'cpy Fisiere de comenzi (C) Laborator SO Unix K.1994'

echo

echo $1:

echo

if test -d $1

then

ls -a $1/*

for nume in $1/.[a-z,A-Z]* $1/*

do

if test -r $nume

then

sh prtr $nume

fi

done

else

cat $1

fi

3.3. Fisierul de comenzi de mai jos permite copierea unui fisier in alt fisier sau mai multor fisiere intr-un director.

# preia argumentele

nrargs=$#

filelist=

copylist=

echo 'cpy Fisiere de comenzi (C) Laborator SO Unix Adi K. 1995'

# salveaza argumentele mai putin ultimul in filelist

while [ '$#' gt 1 ]

do

filelist='$filelist $1'

shift

done

dest='$1'

# daca sunt: a) mai putin de doua argumente,

# sau b) mai mult de doua fara ca ultimul sa fie director

if [ '$nrargs' lt 2 o '$nrargs' gt 2 a ! d '$dest' ]

then

echo 'Usage: cpy file1 file2'

echo ' cpy file(s) dir'

exit 1;

fi

# construieste destinatia

for from in $filelist

do

if [ d '$dest' ]

then

destfile='$dest/`basename $from`'

else

destfile='$dest'

fi

# pentru fiecare fisier din filelist se verifica daca acesta

# exista si se afiseaza un mesaj de suprascriere. Daca raspunsul e

# yes sau daca fisierul nu exista acesta este adaugat la copylist.

if [ f '$destfile' ]

then

echo n '$destfile already exists; Overwrite (yes/no)?:'

read answer

if [ '$answer' = yes ] # se lasa spatiu pentru operator!

then

copylist='$copylist $from'

fi

else

copylist='$copylist $from'

fi

done

if [ n '$copylist' ]

then

echo e 'Copy tFrom: $copylist'

echo e 'tTo: $dest'

cp $copylist $dest

fi

4. Probleme propuse pentru rezolvare

4.1. Ce afiseaza secventele de comenzi:

a) eval echo $$#

b) x=100

px=x

eval echo $$px

eval $px=5

echo $x

c) trap 'echo logged off at `date` >> $HOME/logoffs' 0

trap

logout

d) ls -l > fis 2>&1

e) exec 2>/tmp/err

f) wc <&-

g) line='Laborator SO: Unix: Anul IV'

IFS=:

set $line

echo $#

for camp; do echo $camp; done

h)     file=$1

count=0

while read line

do

count=`expr $count + 1`

done < $file

echo $count

Nota: bucla while este executata intr-un subshell deoarece intrarea ei este redirectata din $file.

4.2. Sa se precizeze ce realizeaza comenzile:

who | wc -l > fis

ls *.c | wc -l >> fis

who | sort

myexe 2>error &

sort < fis | wc

4.3. Folosind comanda eval sa se scrie un program, recho, care afiseaza argumentele sale in ordine inversa. Se presupune ca programul nu admite mai mult de noua argumente in linia de comanda.

4.4. Fisierul de comenzi de mai jos decide daca doua directoare sunt identitice din punct de vedere al continutului lor in fisiere sursa C. Programul are insa o eroare. Care este ea ?

crtdir=`pwd`

if [ d $1 ]

then

if [ d $2 ]

then

cd $1

ls R > $crtdir/f1

cd $crtdir

cd $2

ls R > $crtdir/f2

cd $crtdir

# ramane numai ce e cu '.c' ordonat alfabetic

grep '.c$' f1 > f11

grep '.c$' f2 > f22

rm f1 f2

if cmp f11 f22

then

echo 'Directories are equal'

else

echo 'Different directories'

fi

rm f11 f22

else

echo '$2 isn't directory'

fi

else

echo '$1 isn't directory'

fi

4.5. Sa se scrie un fisier de comenzi, care verifica daca doua directoare sunt egale. Numele celor doua directoare se transmit ca argumente in linia de comanda. Doua directoare se considera ca sunt egale daca contin aceleasi fisiere. Nu conteaza ordinea lor.

4.6. Sa se scrie un fisier de comenzi care permite cautarea unui fisier in intreaga structura a unui subdirector. Argumentele se precizeaza in linia de comanda.

4.7. Sa se scrie un fisier de comenzi care sterge toate sursele C dintr-un director dacaa ele se gasesc in structura altui director. Primul argument din linia de comanda este directorul in care se afla sursele C, iar al doilea este directorul de unde incepe cautarea.

4.8. Sa se scrie un fisier de comenzi care copiaza o intreaga structura de subdirectore ca structura a unui alt subdirector. Cele doua subdirectoare se citesc ca argumente din linia de comanda.

4.9. Sa se scrie doua fisiere de comenzi care sa se sincronizeze intre ele.

4.10. Sa se verifice si sa se explice ce realizeaza secventa de comenzi:

ftp n server2 >tmp <<gata

user adi adi

cd edi

mget FIS

y

gata

Nota: 'server2' este numele unui server Unix.





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate