Sunteți pe pagina 1din 4

PARAMETRII LINIEI DE COMANDA

Exista posibilitatea ca in momentul executiei unui program scris in limbajul C sau Pascal sa i se transmita acestuia
argumente (parametri) in cadrul liniei de comanda. Aceasta facilitate (respectiv a accesarii acestor parametri) este
oferita de fapt de catre sistemele de operare, care sunt raspunzatoare de corecta transmitere a acestor parametri.
Ca dovada a acestei afirmatii, a se vedea facilitatile de referire la parametrii din linia de comanda oferite in cadrul
fisierelor de comenzi (MS-DOS, Unix).

In cazul in care dorim ca programele executabile (care nu sunt altceva decat comenzi ale SO sub care se lucreaza)
dezvoltate de noi la un moment dat sa poata beneficia de o astfel de facilitate, ne punem problema in ce
masura limbajele de programare in care lucram ne ofera posibilitatea de a referi eventualii parametri din linia de
comanda. Ideea pe care vrem sa o subliniem aici este faptul ca nu este de ajuns "efortul" unei singure parti (adica
fie numai a SO, fie numai a limbajului in care lucram) ci este nevoie de existenta de facilitati la nivelul ambelor
parti implicate in dezvoltarea si executia aplicatiilor.

Vom analiza aici, pe scurt, facilitatile oferite de limbajele de programare Pascal si C(++) in acest sens.

Sa facem de la inceput precizarea, ca standardul limbajului Pascal (spre deosebire de standardul limbajului C) nu
ofera posibilitatea accesarii eventualilor parametri in linia de comanda.

Implementarea Turbo Pascal dispune in cadrul unit-ului System de doua functii speciale destinate acestui
scop: ParamCount si ParamStr. Asadar, sa remarcam faptul ca nu limbajul Pascal standard prevede o astfel de
facilitate ci doar implementarea Borland a acestuia (si bineinteles, si alte implementari ale Pascal-ului o fac - de
exemplu, Pascal Sun sub Unix, insa cu o altfel de sintaxa).

Functia ParamCount din Borland Pascal returneaza numarul de parametri introdusi in linia de comanda la
momentul lansarii programului. Parametrii trebuie sa fie separati prin spatiu sau tab.

Sintaxa functiei este:

function ParamCount:word;

Functia ParamStr returneaza valoarea parametrului de


rang specificat din cadrul liniei de comanda. Functia are sintaxa:

function ParamStr (indice:word):string;

unde indice desemneaza rangul parametrului din linia de comanda. Daca indice este mai mare decat valoarea
returnata de functia ParamCount atunci ParamStr returneaza sirul vid, iar daca indice are valoarea zero atunci
ParamStr returneaza chiar numele programului lansat in executie impreuna cu calea de acces spre acesta.

Exemplul urmator afiseaza eventualii parametri aflati in linia de comanda:

program listpar;
var i:integer;
begin
if ParamCount = 0 then writeln('Nu sunt parametri...')
else
for i:=1 to ParamCount do writeln(i,' ',ParamStr(i));
end.

In acelasi scop, in limbajul C standard (deci nefiind un apanaj al mediului Turbo - asa cum este in Turbo
Pascal) exista posibilitatea specificarii a doua argumente ale functiei main (sa remarcam deci o alta diferenta intr
e cele 2 limbaje: in Pascal este vorba de functii iar in
C este vorba de argumente; functionalitatea si tipul de informatie oferit este insa aceeasi):

- argc - reprezentand numarul de argumente din linia de comanda care


a lansat programul (echivalentul valorii returnate de functia ParamCount din Turbo Pascal);
- argv - pointer la un tablou de pointeri la siruri de caractere, siruri reprezentand chiar argumentele;

Prin conventie argv[0] este un pointer la numele programului apelat, astfel ca argc este cel putin 1, iar *argv (tiparit
cu descriptorul "%s") este chiar numele programului lansat (echivalent cu ParamStr(0) din Turbo Pascal). Daca
argc=1 atunci nu avem parametri in linia de comanda (echivalent cu situatia ParamCount=0 din Turbo Pascal).
Exemplul dat mai sus in Turbo Pascal se poate scrie in C astfel:

main(argc, argv) int argc; char *argv[];


{ int i;
for (i=1; i < argc; i++)
printf("%s%c", argv[i], (i < argc-1) ? ' ':'\n');
}

argv fiind un pointer la un tablou de pointeri, exista si variante echivalente de scriere a acestui program. Dam
in continuare inca doua variante:

1). main(argc, argv) int argc; char *argv[];


{
while (--argc > 0)
printf("%s%c", *++argv, (argc > 1) ? ' ':'\n');
}

2). main(argc, argv) int argc; char *argv[];


{
while (--argc > 0)
printf( (argc>1) ? "%s":"%s\n" , *++argv);
}

2. Exemple adecvate si semnificative care sa ilustreze necesitatea unui asemenea mecanis


m la nivelul limbajelor de programare
 Prin intermediul parametrilor liniei de comanda programele pot comunica cu
exteriorul (utilizatorul, sistemul de operare, alte programe). Acest lucru este util
în special dacă se doreste efectuarea unui numar mare de setări de configurare.
 Argumentele liniei de comandă sunt utilizate împreună cu scripturile și fișierele
batch, care este deosebit de utilă pentru testarea automată.

Ex. comunicare cu utilizatorul:


void main(int argc, char *argv[])

if (argc !=2) {

printf("Specify a password");

exit(1);

if (!strcmp(argv[1], "password"))

printf("Access Permitted");
else

printf("Access denied");

exit(1);

program code here ......

>>./test.EXE “password”

Ex: un program care muta fisiere, invoca 2 parametrii – fisierul sursa si cea destinatie:
#include <iostream>

int main(int argc, char* argv[])


{
if (argc < 3) { // We expect 3 arguments: the program name, the source
path and the destination path
std::cerr << "Usage: " << argv[0] << "SOURCE DESTINATION" <<
std::endl;
return 1;
}
return move(argv[1], argv[2]); // Implementation of the move function
is platform dependent
// and beyond the scope of this article, so it is left
out.
}

Acest program permite acces la codul său numai dacă utilizatorul introduce parola corectă in
linia de comandă.

3. O analiza critica si comparativa a modului in care o astfel de functionalitate


este implementata la nivelul diferitelor limbaje de programare (Python, Java,
Javascript).

 In Python modulul sys ne ofera acces la argumentele liniei de comanda


(sys.argv), in timp ce in Javascript lista de argumente este furnizata de
process.argv, pe cand in Java vectorul args (specificat in interiorul
functiei main), primit de aplicatie ca parametru al metodei main,
contine argumentele liniei de comanda, fara a fi nevoie de apelul unui
modul diferit
 In Python, precum in C, primul argument va contine (argv[0]) numele
scriptului si se va contora la lungimea vectorului argumentelor. In
Javascript situatia sta putin diferit: argv[0] va fi process.execPath, iar
argv[1] va fi calea catre fisierul executat, restul elementelor fiind cele
introduce de la consola. Spre deosebire de aceste limbaje, in Java
vectorul primit de metoda main nu contine pe prima pozitie numele
aplicatei, intrucat in Java numele aplicatiei este chiar numele clasei
principale, adica a clasei in care se gaseste metoda main.
 Ca rezultat al diferentei primului element din vectorul de argumente
(respectiv primele 2 in cazul Javascriptului), va diferi si numarul de
argumente. Daca n este numarul de argumente introduse in Python vor
fi n+1 argumente, in Javascript n+2, iar in Java n
 Regula valabila pentru toate limbajele cercetate in acest material: in
cazul in care sunt mai multe argumentele trebuie separate prin spatii,
iar daca unul dintre argumente contine spatii, atunci el trebuie pus intre
ghilimele.
 O alta trasatura comuna este faptul ca toate limbajele cercetate citesc
argumentele de la linia de comanda ca si stringuri.

4. Propuneri de extindere/imbunatatire.

In primul rand, din perspectiva utilizatorului, as invata mai multa lume utilizarea
liniei de comanda, pentru ca mai multa lume sa se poata folosi de acest avantaj al
limbajelor de programare de a folosi argumente in linia de comanda. Tot in privinta
utilizarii liniei de comanda, as pune disponibil folosirea liniei de comanda si pe
telefoane (Android, IOS etc), nu stiu in ce masura ar exista aceasta posibilitate de a
putea rula un program cu argumente in linia de comanda pe telefon.
Din perspectiva programatorului, nu as mai include un al 3lea element care sa
reprezinte tipul elementelor introdus, ci as lasa asa cum e, de a citi sir de caractere,
care pe urma este usor de convertit in orice alt tip de date. Plus, avantajos ar fi atunci
sa nu se specifice doar tipul intregului sir de elemente care se va introduce, ci pentru
fiecare leement in parte, iar astfel lucrurile s-ar complica in privinta programatorului
si nicidecum nu s-ar simplifica. O imbunatatire pe care l-as sugera ar fi securizarea
argumentelor care se pot introduce in linia de comanda. Stim foarte bine ca exista
multe vulnerabilitati datorita argumentelor care pot fi introduse de la comanda (cu
mar fi Command Injection) si acestea chiar sunt exploatate de cei cu rea intentie.
Astfel intr-un fel sau altul as “purifica” elementele introduse cu rea intentie.

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