Linux şi aplicaţii Web în 24 de ore  
introducere în Linux şi iniţiere în dezvoltarea de aplicaţii Web

Linux şi aplicaţii Web în 24 de ore

Ubuntu şi programare sub Linux

«  Întrebări conjuncturale   ::   Contents   ::   Dezvoltarea de aplicaţii Web simple  »

Ubuntu şi programare sub Linux

http://www.ubuntu.com/download/ubuntu/download descrie amănunţit mai multe posibilităţi de instalare pentru Ubuntu-11.04 (sau Ubuntu 10.04).

Nu ţin minte să fi întâlnit vreodată termenul “Linux”, în documentaţia Windows-ului… Folosind numai şi numai Windows poţi avea anumite limitări, implicând dorinţa de a nu afecta sistemul propriu. Deasemenea, în cazul laboratoarelor de informatică din diverse şcoli pot exista restricţii de operare asupra “reţelei de calculatoare primite de la minister”…

Pentru aceste situaţii, soluţia cea mai simplă şi suficient de bună constă în a instala Ubuntu pe un stick (a vedea Live USB); pentru a folosi apoi Ubuntu de pe stick, trebuie doar să se modifice în BIOS ordinea de “bootare” (întâi de pe stick).

Dar realitatea este că Ubuntu se poate instala pe hard-disk alături de Windows, fără probleme. Eventual, la Installing Ubuntu se poate vedea o descriere minuţioasă a procesului de instalare “dual-boot”.

Ultima versiune Ubuntu-11.04 a introdus o nouă “interfaţă-utilizator” (a vedea Unity) - probabil că aceasta se potriveşte mai bine categoriei celei mai largi de utilizatori. Dar în momentul lansării sistemului se poate opta pentru Ubuntu classic, iar aici vom avea în vedere tocmai “interfaţa clasică” (preferată totuşi, de către programatori).

Interfaţa grafică şi principiul separării

“Interfaţa grafică” (sau Desktopul) permite unui utilizator oarecare să folosească sistemul (Windows, Ubuntu, etc.), fără să aibă neapărat cunoştinţe de programare (foloseşte meniurile puse la dispoziţie). Pentru utilizatorul obişnuit interfaţa grafică se prezintă (sau trebuie prezentată) ca atare: meniul cutare permite cutare acţiuni, click pe cutare icon face asta, ş.a.m.d.

Dar pentru utilizatorul care intenţionează să se ocupe de programare şi de dezvoltarea unor aplicaţii proprii - interfaţa grafică are o anumită logică, servind (e vorba nu de Windows, ci de Ubuntu Linux) cât se poate de bine “cele mai bune practici” de dezvoltare a aplicaţiilor.
A folosi cmd.exe pe Windows a devenit de-a dreptul nefiresc, în timp ce pe Ubuntu Linux lucrul cu Terminale (cu linia de comandă, cu shell-uri) şi pe de altă parte, operaţiile obişnuite prin intermediul interfeţei grafice - sunt corelate din start în modul cel mai firesc.
Mai toate distribuţiile de Linux (inclusiv Ubuntu) integrează din start compilatorul GCC, interpretorul (şi limbaj de programare) Bash, interpretorul Perl, etc. Totodată, browserele integrează şi recunosc HTML, CSS, javaScript, etc.
Indiferent în ce limbaje s-ar lucra un program sau o aplicaţie Web, metoda de dezvoltare este aceeaşi - implicând folosirea următoarelor instrumente:
  • un editor de cod-sursă - pentru a scrie într-o manieră standard fişierele necesare;
  • Terminalul (linia de comandă) - pentru a invoca interpretorul sau compilatorul corespunzător;
  • browserul - pentru a testa aplicaţia Web pe parcursul dezvoltării ei (ca şi pentru a te documenta);
  • linia de comandă şi diversele utilitare GNU - pentru a defini VirtualHost-uri, a uploada fişiere pe un server, etc.

În mod implicit există două panouri (“panel”) - unul sus, iar celălalt la baza ferestrei (sau desktopului). Panoul de sus conţine un meniu cu trei itemuri: Applications (Browse and run installed applications), Places (Access documents, folders and network places), System (Change system appearance and behavior, or get help). Click Applications/Accessories deschide un meniu similar celui redat în imaginea alăturată.

Agăţând cu mouse-ul un item (Terminal de exemplu), îl putem trage cu mouse-ul în panelul de sus; urmarea va fi aceea că în oricare moment vom putea lansa aplicaţia respectivă cu click pe iconul corespunzător din panelul de sus (fără să mai accesăm şi să căutăm în meniuri).

Patru aplicaţii sunt importante şi este recomandabil să fie “trase” în panoul de sus: Terminal (Use the command line), Text editor (implicit, gEdit), browserul implicit Firefox (vezi meniul Applications/Internet) şi eventual, GNOME Commander.

Terminalul ne va permite (în cel mai simplu mod) să creem sau să listăm structuri de fişiere, să lansăm diverse programe utilitare sau aplicaţii şi încă multe alte operaţii; gEdit este un veritabil editor de cod-sursă pentru diverse limbaje (având facilităţi de indentare automată, marcare a cuvintelor cheie şi a parantezelor, constituirea unor sesiuni de lucru, etc.); Firefox ne va servi (pe lângă scopurile obişnuite pentru un browser) pentru testarea şi depanarea aplicaţiilor Web la care vom lucra, pentru investigarea (în scop de instruire) la nivel de limbaj HTML, CSS, javaScript a unei pagini Web şi pentru autodocumentare (căutând cu Google, sau pe Wikipedia).

GNOME Commander nu este instalat în mod implicit, dar este util să fie instalat. Avem două modalităţi pentru a instala o nouă aplicaţie: deschidem Applications/Ubuntu Software Center şi folosim caseta de căutare (tastăm acolo “gnome comma”), sau mai instructiv - deschidem un Terminal (click pe iconul corespunzător din panelul de sus în care l-am târât cu mouse-ul, anterior) şi tastăm comanda următoare:

sudo apt-get install gnome-commander

Diferenţa între cele două modalităţi de instalare (prima - de tip “point-and-click”, foarte comodă; a doua - folosind linia de comandă) poate fi importantă: în primul caz se va cere parola de root fixată la instalarea sistemului, iar în al doilea de regulă nu se va mai cere această parolă (la instalare, comanda sudo a fost astfel configurată încât să i se permită userului obişnuit “să se dea drept” user root - exceptând unele situaţii - putând astfel să efectueze operaţii rezervate de regulă pentru “root”).

Pentru orice comandă există câte o pagină de manual, accesibilă tastând de exemplu:

man sudo

sau, pentru încă un exemplu: man apt-get. Pagina de manual respectivă se va deschide în Terminal şi va putea fi închisă cu o combinaţie de taste standard: SHIFT + Q (‘Q’ de la “quit”).

Experienţa tocmai descrisă arată deja faptul că în Ubuntu Linux este cum nu se poate mai firesc, să foloseşti atât interfaţa grafică (meniurile şi “point-and-click”), cât şi linia de comandă. Mai este de evidenţiat şi faptul (specific unui mediu Linux) că utilizatorul are adesea posibilitatea de a opta între mai multe programe similare ca scop; de exemplu, puteam folosi foarte bine Midnight Commander (care este instalat implicit; a vedea man mc) în loc de a mai instala GNOME Commander.

Interfaţa grafică din Ubuntu serveşte foarte bine unui principiu esenţial pentru crearea şi dezvoltarea unei aplicaţii: principiul separării. L-am întâlnit toţi, sub o formă sau alta: când faci un program în C++, începi de regulă cu o zonă de declaraţii #include şi #define; adaugi o zonă în care prevezi variabilele globale; apoi, o zonă în care prevezi prin prototipuri, funcţiile necesare; apoi o zonă pentru funcţia main() şi dacă este cazul, câte o zonă pentru definiţiile funcţiilor prevăzute anterior prin prototip.

Pentru un alt exemplu - o aplicaţie Web este constituită de regulă din mai multe fişiere, de diverse tipuri: HTML, CSS, javaScript, PHP, MySQL, etc. şi pe parcursul dezvoltării necesită nu numai editarea fişierului, dar eventual şi crearea sau investigarea unor tabele ale unei baze de date (ceea ce, în cel mai simplu mod, se face folosind un Terminal), necesită acces la un “remote server” pentru a uploada fişierele create (necesitând iarăşi lucrul în Terminal), precum şi testări sau investigări folosind un browser.

Putem separa lucrurile chiar de la începerea lucrului asupra aplicaţiei, folosind pentru aceasta panelul de la baza Desktopului Ubuntu: există aici, în mod implicit, patru Workspace şi le putem folosi astfel: click pe “Workspace 1”, click iconul Terminal din bara de sus, click iconul lui GNOME Commander; click “Workspace 2” şi click iconul lui gEdit; click “Workspace 3” şi click iconul Firefox. Astfel, am deschis Terminal şi Commander în primul “workspace”, gEdit în al doilea şi Firefox în al treilea; putem lucra în gEdit (după ce vom fi maximizat fereastra de editare) şi un click pe al 3-lea workspace din bara de jos ne va permite să vedem rezultatul în Firefox, după care click pe al doilea ne readuce în gEdit.

Să mai precizăm că panourile (şi cel de sus şi cel de jos) pot fi “personalizate” după necesităţi: click-dreapta în interiorul panelului deschide un meniu care permite diverse configurări.

Puteţi descoperi uşor diverse alte posibilităţi de configurare accesând meniul System/Preferences. A vedea neapărat, submeniul Keyboard Preferences/Layouts - în care puteţi seta (există un button “Add...”) Romania Cedilla, permiţând să folosiţi în textele pe care le editaţi (şi chiar în Terminal) caracterele româneşti; regula instituită este simplă: tasta ALT-dreapta + litera-standard (de exemplu pentru caracterul ă, se tastează ALT-dreapta şi tasta inscripţionată ‘a’).

Mai este o posibilitate de setare pentru caracterele româneşti, denumită tot “Romania” (fără “Cedilla”) - aparent mai bună (semnul adăugat dedesubtul lui ‘s’ ca să dea ‘ş’ este o virgulă în loc de “cedilla”, ceea ce este într-adevăr mai elegant), numai că aceasta nu este suficient suportată de pachetele software uzuale (de exemplu, de MySQL), în timp ce “Cedilla” este un layout larg recunoscut.

O opţiune “Preferences” există şi în diverse aplicaţii - a vedea meniul Edit/Preferences din gEdit, pentru configurări convenabile lucrului cu fişiere cod-sursă în diverse limbaje.

În meniul System/Administration avem un program de care e bine de ştiut: System Monitor (View current processes and monitor system state). Dacă de exemplu, browserul “a îngheţat” (ceea ce se poate întâmpla când rulează un script recursiv conceput fără precauţiile de rigoare), sau când vreun “applet” refuză să se mai termine de executat şi să se închidă - atunci deschizând “System Monitor” şi identificând (marcând în listă) procesul în cauză, el va putea fi stopat (click-dreapta pe item, sau folosind direct butonul “End process”).

Deasemenea este bine de ştiut că se poate comuta între “desktop” şi consolă” folosind o combinaţie tipică de taste: Ctrl + Alt + F1 (sau F2, ..., F6) comută pe “consolă” (permiţând operaţii prin linia de comandă), iar Ctrl + Alt + F8 va reveni pe “desktop”.

Elemente de programare sub Linux

Discutăm câteva comenzi importante (whereis, mkdir, cd, touch, ls şi altele) şi ne ocupăm de un program în C++, apoi de unul în Bash; va fi suficient pentru a vedea că putem institui o aceeaşi manieră de lucru (şi tocmai cea recomandată), indiferent de limbajul folosit.

Mai întâi, deschidem un terminal (eventual şi Commander) în “Workspace 1” şi gEdit în “Workspace 2”. Accesăm terminalul pentru a crea un director de lucru pentru proiectele la care vom lucra:

mkdir -p Proiecte; cd Proiecte

Să verificăm că gcc, perl, bash sunt deja instalate (valabil pentru orice distribuţie de Linux), tastând pe linia de comandă a terminalului:

whereis perl gcc bash g++

perl: /usr/bin/perl /etc/perl /usr/lib/perl /usr/share/perl ...
gcc: /usr/bin/gcc /usr/lib/gcc /usr/share/man/man1/gcc.1.gz
bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz
g++:

whereis a găsit şi a listat calea către fişierul executabil corespunzător (/usr/bin/, respectiv /bin/), calea către fişiere sursă şi biblioteci precompilate (/lib/) şi respectiv către manualul corespunzător (care va fi deschis în Terminal cu man gcc, de exemplu).

Am adăugat mai sus şi g++, în lista de parametri ai comenzii; dar acesta nu a fost găsit - să-l instalăm, fiindcă fără el nu am putea folosi C++ (ci doar C); pentru aceasta, accesăm Applications/Ubuntu Software Center şi tastăm în inputul destinat căutării (“Search”) g++, iar din lista afişată alegem “The GNU C++ compiler” (a vedea însă că sunt mai multe versiuni - alegeţi g++ 4.4); apoi - click “Install”. După încheierea instalării, folosiţi whereis g++.

Un program “cmmdc” cu g++ şi biţii de mod “wxr”

Limbajul C++ este practicat mai în toate laboratoarele, dar cum? Cel mai obişnuit - în manieră point-and-click, folosind clona de GCC pentru Windows, minGW (şi încă instalată excluzând posibilităţile de “Help” pe care probabil că le oferă şi minGW - exact pe dos de cum stau lucrurile pe un sistem Linux, unde man şi opţiunea -h pentru “help” însoţesc în mod implicit cam orice program: încercaţi perl -h).

Arătăm pe un exemplu simplu (să se determine cel mai mare divizor comun) cum se poate lucra un program C++ fără intermediul inutil şi opacizant al vreunui IDE.

Creem de pe linia de comandă un subdirector în /Proiecte (care este acum - în urma comenzii cd anterioare - directorul de lucru curent): mkdir Cmmdc-GCC; cd Cmmdc-GCC şi în acest director creem un fişier pentru programul nostru: touch cmmdc.cpp. Apoi intrăm în “workspace” în care avem gEdit şi deschidem fişierul ‘cmmdc.cpp’ (folosind fie meniul “File” al editorului, fie combinaţia de taste CTRL + O cu “O” de la “Open”).

gEdit va recunoaşte după extensia fişierului, ce fel de program sursă vrem să edităm şi va marca (“highlight”) cuvintele cheie specifice limbajului respectiv, va aplica automat regulile de indentare a codului sursă, de marcare a acoladelor şi parantezelor, de folosire a caracterului TAB, etc. (pentru configurarea editorului - vezi meniul său Edit/Preferences).

Dacă dorim, în finalul editării vom putea tipări fişierul exact în forma sub care apare în editor (cu “highlight” pe cuvintele cheie, etc.) astfel: folosim meniul Print.../General/Print to File, indicând ca “Output format” PDF (apoi, click pe butonul “Print”); intrăm apoi în GNOME Commander, identificăm fişierul PDF respectiv şi-l deschidem (click direct lansează aplicaţia implicită pentru fişiere PDF; click-dreapta permite selectarea unei aplicaţii care să-l deschidă) - aplicaţia care îl va deschide va permite şi tipărirea.

Să presupunem că am editat în gEdit fişierul “cmmdc.cpp” (şi l-am salvat în directorul curent de lucru; considerăm că nu-i cazul să redăm aici acest mic program în C++, de calcul a CMMDC a două numere). Intrăm în “workspace” în care avem deschis Terminal-ul şi invocăm compilatorul GCC de pe linia de comandă astfel:

g++ -o cmmdc cmmdc.cpp

Se va obţine (în directorul de lucru) fişierul executabil “cmmdc” (sau, se va afişa o listă explicită de erori, dacă programul n-a putut fi compilat, sau n-a putut fi transformat în “executabil”). Pentru execuţie, îl putem invoca de pe linia de comandă astfel:

./cmmdc

Să observăm că nu se poate invoca pur şi simplu prin cmmdc, pentru motivul că interpretorul de comenzi ar confunda cu o invocare de comandă existentă în Linux, ori ‘cmmdc’ este un “program-utilizator”, nu al Linux-ului; este necesară prefixarea cu ./ - indicând explicit că se cere încărcarea şi lansarea unui program existent în directorul de lucru curent (şi nu ajunge numai ., fiindcă acest prefix (punctul) indică în Linux un “fişier ascuns”; este astfel necesar, prefixul “complet” ./).

Dar cum recunoaşte Linux calitatea de “executabil” a fişierului indicat? Pe Windows este obligatorie extensia .exe (sau ”.com”, ”.bat”) - dar pe Linux (de regulă) nu este necesară vreo extensie a numelui fişierului. Pe orice sistem de operare (SO), un fişier înseamnă mult mai mult decât pur şi simplu, numele şi eventual extensia; de exemplu, odată cu crearea sau salvarea fişierului sunt înregistrate de către SO şi informaţii contextuale precum: ce dimensiune are fişierul, data şi momentul de timp al creării sau modificării, şi altele.

Pe Linux (şi pe alte SO, dar nu şi pe Windows) se mai ataşează fişierului şi o informaţie sintetică (16 biţi) referitoare la tipul fişierului (director, sau “fişier regulat”), proprietarul fişierului (userul care a creat fişierul, “user” însemnând aici nu neapărat cineva căruia i s-a creat un subdirector în /home, dar la fel de bine o aplicaţie care a creat fişierul respectiv, de exemplu serverul Apache), drepturile asupra fişierului (write, read, execute) ale proprietarului, ale grupului din care face el parte şi ale celorlalţi “useri”.

Putem folosi comanda ls cu opţiunea -la, pentru a obţine informaţii despre fişierele din directorul nostru de lucru:

    ls -la
drwxr-xr-x 2 vb vb 4096 2011-03-23 17:13 .
drwxr-xr-x 3 vb vb 4096 2011-03-23 17:09 ..
-rwxr-xr-x 1 vb vb 7718 2011-03-23 17:13 cmmdc
-rw-r--r-- 1 vb vb  207 2011-03-23 17:12 cmmdc.cpp

ls -la ne-a afişat informaţii despre directorul curent (indicat prin .), directorul părinte (..) şi despre fişierele existente în directorul curent. Toate fişierele listate (directorul este şi el, un fişier) aparţin (în exemplul redat aici) userului “vb”, care face parte din grupul “vb”; fişierul “cmmdc.cpp” are dimensiunea de 207 octeţi (bytes).

La începutul fiecărui rând sunt afişate “permisiunile” corespunzătoare fişierului respectiv (aici, pe câte 10 caractere - fiecare corespunzând prin poziţie câte unui bit dintr-o valoare binară). Primul caracter este d pentru director şi - pentru fişier regulat; următoarele trei caractere reprezintă drepturile proprietarului (“owner”), grupul următor de trei caractere - drepturile grupului din care face parte proprietarul, iar ultimul grup - drepturile celorlaţi useri asupra fişierului respectiv.

Astfel, cmmdc este un fişier executabil, care va putea fi deschis şi eventual suprascris numai de către “owner” (numai în primul grup apare w, la celelalte apare -) şi va putea fi “citit” şi executat de către oricine (în toate cele trei grupe apare r-x). Fişierul cmmdc.cpp nu este unul executabil (lipseşte x), va putea fi editat numai de către owner şi va putea fi citit de către oricine.

Exemple de scripturi Bash

Interpretorul de comenzi (sau shell) devenit standard pe Linux este Bash. El interpretează şi execută comenzile tastate în terminal pe linia de comandă - servind astfel ca interfaţă către numeroasele programe utilitare GNU existente. Totodată, Bash este un limbaj de programare - permiţând în fond crearea de noi comenzi (nu numai combinarea direct în linia de comandă, a diverse programe existente); o “nouă comandă” este în fond numele unui fişier text care conţine secvenţe de comenzi Linux uzuale şi eventual secvenţe de instrucţiuni Bash (astfel de fişiere sunt denumite scripturi şi ele trebuie să respecte o anumită regulă).

Să presupunem că am găsit o carte publicată pe Internet, care ne interesează şi vrem să o descărcăm de la adresa respectivă. Dar nu ni se oferă un link prin care să putem descărca întreaga carte, ci doar link-uri pentru fiecare capitol al cărţii:

_images/Screenshot-255.png

Programul GNU wget (“The non-interactive network downloader”: man wget) poate fi utilizat (fie direct din linia de comandă, fie dintr-un script) pentru a descărca fişiere de pe Internet. Fiindcă ar fi de descărcat 13 fişiere, n-avem decât să formulăm un script în care să specificăm fişierele respective şi pentru fiecare, să invocăm wget.

Dar de obicei, denumirile fişierelor respective au o rădăcină comună, diferind numai printr-un index: “chap00.pdf”, “chap01.pdf”, ..., “chap13.pdf”. Putem genera indecşii folosind programul GNU seq (vezi man seq); opţiunea -w asigură completarea cu zerouri, încât valorile generate să apară de aceeaşi lăţime (seq 13 va genera pe câte o linie 1, 2, ..., 13 dar seq -w 0 13 va genera 00, 01, ..., 09, 10,...).

Combinând wget, seq şi câteva elemente de programare în Bash, putem formula următorul script care ne va rezolva problema (să-i zicem down-book.sh; îl edităm folosind gEdit; extensia ”.sh” nu este necesară, dar marchează tipul de script - un “shell script” - ceea ce este util când investigăm - cu ls, sau din Commander - conţinutul unui folder; deasemenea, extensia permite lui gEdit să aplice regulile de marcare a codului sursă specifice pentru scripturi shell):

#! /bin/bash

for i in $(seq -w 0 12)
do
    wget "http://web.science.mq.edu.au/~chris/langmach/chap$i.pdf"
done

Regula pe care trebuie să o respecte orice shell script este următoarea: pe prima linie a fişierului, la începutul ei, trebuie înscris #! (secvenţă referită prin “shebang”), urmată (cu sau fără spaţiu) de precizarea interpretorului (cu tot cu “path”) care va trebui folosit de shell pentru a interpreta şi executa conţinutul fişierului respectiv (interpretorul poate fi bash ca în cazul de faţă, dar la fel de bine poate fi perl, php, etc.). Amintim că mai demult am folosit whereis bash pentru a găsi unde este locat programul, încât acum am putut scrie prima linie cum se vede în codul sursă redat mai sus.

$(comandă) este o construcţie de substituire: se execută comanda indicată şi apoi se înlocuieşte $(comandă) cu rezultatul acestei execuţii. În cazul de faţă, $(seq -w 0 12) decurge astfel: se execută comanda seq -w 0 12 (ca şi când am lansa-o de pe linia de comandă), rezultând secvenţa 00, 01, 02, ..., 12; se înlocuieşte invocarea comenzii cu secvenţa obţinută, rezultând în fond: for i in 00 01 02 ... 12.

Pentru a lămuri distincţia între i şi $i (a vedea “chap$i.pdf” din parametrul indicat lui wget în programul redat mai sus) - tastaţi pe lina de comandă:

my=123; echo my $my
Se va afişa: my 123
$my este conţinutul variabilei (deci 123), iar my este pur şi simplu numele variabilei. În cazul programului de mai sus, chap$i.pdf va lua pe rând valorile chap00.pdf, chap01.pdf, ..., chap12.pdf (evident, omiţând “$” am fi obţinut de 13 ori “chapi.pdf”).
Să observăm că am scris “my=123” şi nu “my = 123” (cum am scrie conform “bunelor practici” în aproape oricare limbaj, separând prin spaţiu operatorul, faţă de operanzi). Însă Bash este un interpretor de comenzi; comandă înseamnă orice identificator corect construit care este scris primul pe linia de comandă; deci scriind my = 123 (cu spaţiu după “my”), Bash ar fi căutat comanda “my” pentru a o executa (interpretând “= 123” drept opţiuni sau parametri ai comenzii) şi desigur - ar fi afişat “Command not found”.
În Bash atribuirile trebuie scrise fără a folosi spaţiu în jurul operatorului “=”.

Acum, ca să executăm programul trebuie să ne amintim de biţii de mod “wxr”, la care ne-am referit mai sus. Pentru a seta fişierului bitul x (de fişier executabil) trebuie să folosim chmod +x down-book.sh (“change mode bit x”: man chmod). După aceasta - programul poate fi lansat prin:

     ./down-book.sh
http:... /chap00.pdf
Resolving web.science.mq.edu.au... 137.111.92.31
Connecting to web.science.mq.edu.au|137.111.92.31|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 44989 (44K) [application/pdf]
Saving to: `chap00.pdf'
     ş.a.m.d.

Rezultatul execuţiei va fi apariţia în directorul curent a celor 13 fişiere PDF, descărcate de la adresa indicată lui wget. Dacă am fi folosit browserul ca să downloadăm fişierele, ar fi trebuit să facem 13 operaţii manuale; devine clar avantajul folosirii liniei de comandă şi a unor mici scripturi în scopul uşurării rezolvării unor sarcini.

Sarcina programului de mai sus se putea rezolva şi mai simplu, direct de pe linia de comandă:

wget "http://web.science.mq.edu.au/~chris/langmach/chap*.pdf"

Caracterul * ţine loc (este un “placeholder”) de zero sau mai multe caractere oarecare.

Am folosit şi am explicat mai sus $(comandă). Uneori avem nevoie de un asemenea mecanism de substituire şi pentru cazul când comandă nu este o comandă, ci o expresie aritmetică; Bash prevede o construcţie similară: $((expresie)) va fi înlocuită cu rezultatul evaluării expresiei. Redăm un exemplu, pe tema CMMDC:

#!/bin/bash

# cmmdc.sh 123 456

a=$1   # $1 este primul parametru (123)
b=$2   # $2 este al doilea parametru (456)

while test $((a%b)) -gt 0 do
    r=$((a%b))
    a=$b
    b=$r
done

echo cmmdc = $b

Editaţi acest program “cmmdc.sh” - puteţi selecta textul de mai sus în browser, apoi “paste” (CTRL + V) în gEdit - apoi în Terminal tastaţi comanda de setare a bitului de execuţie (chmod +x) şi puteţi executa programul, furnizând însă şi doi parametri (numerele pentru care trebuie obţinut CMMDC):

cmmdc.sh 123 456

Bash foloseşte variabilele proprii (predefinite) $1, $2 ş.a.m.d. pentru a prelua din linia de comandă parametrii comenzii.

Desigur, dacă se lansează cmmdc.sh 123 0 atunci se va obţine un mesaj de eroare (a%b: division by 0) - programul trebuie corectat puţin, pentru a evita aceasta.

«  Întrebări conjuncturale   ::   Contents   ::   Dezvoltarea de aplicaţii Web simple  »