This shows you the differences between two versions of the page.
uso:laboratoare:laborator-06:inspect-shell [2023/11/07 19:42] maria_irina.gherman [Configurarea shellului Bash] |
uso:laboratoare:laborator-06:inspect-shell [2023/11/07 19:59] (current) maria_irina.gherman [Execuția comenzilor] |
||
---|---|---|---|
Line 91: | Line 91: | ||
==== Încheierea execuției unei comenzi ==== | ==== Încheierea execuției unei comenzi ==== | ||
- | Atunci când rulăm o comandă aceasta își poate încheia execuția în două moduri: cu **succes** sau cu **eșec**. Atunci când își încheie execuția, orice proces întoarce un cod de ieșire (exit code), care este un număr: | + | Atunci când rulăm o comandă, aceasta își poate încheia execuția în două moduri: cu **succes** sau cu **eșec**. Atunci când își încheie execuția, orice proces întoarce un cod de ieșire (exit code), care este un număr: |
- | * Dacă numărul întors are valoarea ''%%0%%'', procesul și-a încheiat execuția cu succes. | + | * Dacă numărul întors are valoarea ''%%0%%'', atunci procesul și-a încheiat execuția cu succes. |
- | * Dacă numărul întors are orice altă valoare, procesul și-a încheiat execuția cu eroare, iar codul întors poate fi folosit pentru a afla mai multe informații despre eroarea pe care a întors-o procesul. În pagina ''%%man%%'' a utilitarului ''%%ls%%'' este specificat. | + | * Dacă numărul întors are orice altă valoare, atunci procesul și-a încheiat execuția cu eroare, iar codul întors poate fi folosit pentru a afla mai multe informații despre eroarea pe care a întors-o procesul. În pagina ''%%man%%'' a utilitarului ''%%ls%%'' este specificat fiecare cod de eroare și ce înseamnă. |
Pentru a vedea codul cu care și-a încheiat execuția o comandă folosim sintaxa ''%%$?%%''. Urmărim exemplul de mai jos: | Pentru a vedea codul cu care și-a încheiat execuția o comandă folosim sintaxa ''%%$?%%''. Urmărim exemplul de mai jos: | ||
Line 112: | Line 112: | ||
=== Înlănțuirea comenzilor în funcție de succes sau eșec === | === Înlănțuirea comenzilor în funcție de succes sau eșec === | ||
- | De multe ori vrem să executăm o succesiune de comenzi pentru a realiza o sarcină. De exemplu, atunci când vrem să instalăm o aplicație o rulăm trei comenzi: | + | De multe ori vrem să executăm o succesiune de comenzi pentru a realiza o sarcină. De exemplu, atunci când vrem să instalăm o aplicație rulăm trei comenzi: |
* O să actualizăm indexul surselor de pachete folosind ''%%apt update%%'' | * O să actualizăm indexul surselor de pachete folosind ''%%apt update%%'' | ||
Line 118: | Line 118: | ||
* O să rulăm aplicația pentru a valida că instalarea a fost cu succes. | * O să rulăm aplicația pentru a valida că instalarea a fost cu succes. | ||
- | Preferăm să înlănțuim cele trei comenzi într-una singură pentru că astfel putem să pornim tot acest proces, să plecăm de la calculator, iar când ne întoarcem avem tot sistemul pregătit. | + | Preferăm să înlănțuim cele trei comenzi într-una singură pentru că astfel putem să pornim tot acest proces, să plecăm de la calculator, iar când ne întoarcem să avem tot sistemul pregătit. |
Pentru a înlănțui comenzi în shellul Bash avem trei operatori disponibili: | Pentru a înlănțui comenzi în shellul Bash avem trei operatori disponibili: | ||
- | Operatorul ''%%;%%'' - este folosit pentru separarea comenzilor Urmăm exemplul de mai jos: | + | Operatorul ''%%;%%'' - este folosit pentru separarea comenzilor. Urmăm exemplul de mai jos: |
<code bash> | <code bash> | ||
Line 139: | Line 139: | ||
</code> | </code> | ||
- | În exemplul de mai sus, comanda ''%%mkdir%%'' a eșuat deoarece nu a găsit directorul ''%%operators%%'' în care să creeze directorul ''%%demo%%''. Cu toate acestea, operatorul ''%%;%%'' doar separă comenzile între ele, așa că și comanda ''%%cd operators/demo%%'' a fost executată, și și aceasta a eșuat deoarece nu există calea ''%%operators/demo%%''. | + | În exemplul de mai sus, comanda ''%%mkdir%%'' a eșuat deoarece nu a găsit directorul ''%%operators%%'' în care să creeze directorul ''%%demo%%''. Cu toate acestea, operatorul ''%%;%%'' doar separă comenzile între ele, așa că și comanda ''%%cd operators/demo%%'' a fost executată, și și aceasta a eșuat, deoarece nu există calea ''%%operators/demo%%''. |
- | Folosim operatorul ''%%;%%'' pentru a înlănțui comenzi care sunt independente unele de altele, și deci execuția lor nu depinde de succesul unei comenzi precedente. | + | Folosim operatorul ''%%;%%'' pentru a înlănțui comenzi care sunt independente unele de altele, deci execuția lor nu depinde de succesul unei comenzi precedente. |
- | Operatorul binar ''%%&&%%'' (și logic) - execută a doua comandă doar dacă precedenta s-a executat cu succes. Exemplul anterior devine: | + | Operatorul binar ''%%&&%%'' (//și// logic) - execută a doua comandă doar dacă precedenta s-a executat cu succes. Exemplul anterior devine: |
<code bash> | <code bash> | ||
Line 152: | Line 152: | ||
Observăm că din moment ce comanda ''%%mkdir%%'' a eșuat, comanda ''%%cd%%'' nu a mai fost executată. | Observăm că din moment ce comanda ''%%mkdir%%'' a eșuat, comanda ''%%cd%%'' nu a mai fost executată. | ||
- | Operatorul binar ''%%||%%'' (sau logic) - execută a doua comandă doar dacă prima s-a terminat cu eșec. Urmărim exemplul de mai jos: | + | Operatorul binar ''%%||%%'' (//sau// logic) - execută a doua comandă doar dacă prima s-a terminat cu eșec. Urmărim exemplul de mai jos: |
<code bash> | <code bash> | ||
Line 200: | Line 200: | ||
</code> | </code> | ||
- | Până acum am efectuat procesări text pe rezultatul unor comenzi. Folosind operatorul ''%%|%%'' și utilitarul ''%%xargs%%'' putem să folosim rezultatul pe post de argument pentru altă comandă, ca în exemplul de mai jos: | + | Până acum, am efectuat procesări text pe rezultatul unor comenzi. Folosind operatorul ''%%|%%'' și utilitarul ''%%xargs%%'' putem să folosim rezultatul pe post de argument pentru altă comandă, ca în exemplul de mai jos: |
<code bash> | <code bash> | ||
Line 215: | Line 215: | ||
Comanda din exemplul de mai sus afișează informații în format lung despre toate fișierele din directorul curent, excluzând directoarele. | Comanda din exemplul de mai sus afișează informații în format lung despre toate fișierele din directorul curent, excluzând directoarele. | ||
- | Dacă folosim opțiunea ''%%-p%%'' a utilitarului ''%%xargs%%'', acesta o să ne afișeze ce comandă urmează să execute și așteaptă confirmarea noastră prin apăsarea tastei ''%%y%%'' (yes) sau ''%%n%%'' (no). Este recomandat să folosiți opțiunea ''%%-p%%'' atunci când vă scrieți onelinerul pentru a verifica că comanda pe care urmează să o executați este corectă. În exemplul următor ne dorim să mutăm toate fisierele ''%%.c%%'' în directorul ''%%părinte%%'': | + | Dacă folosim opțiunea ''%%-p%%'' a utilitarului ''%%xargs%%'', acesta o să ne afișeze ce comandă urmează să execute și așteaptă confirmarea noastră prin apăsarea tastei ''%%y%%'' (yes) sau ''%%n%%'' (no). Este recomandat să folosiți opțiunea ''%%-p%%'' atunci când vă scrieți onelinerul, pentru a verifica dacă comanda pe care urmează să o executați este corectă. În exemplul următor ne dorim să mutăm toate fisierele ''%%.c%%'' în directorul ''%%părinte%%'': |
<code bash> | <code bash> | ||
Line 221: | Line 221: | ||
mv .. casts.c endian.c ptr.c signed-unsigned-representation.c signed-unsigned.c test-hard-link.c use-__thread.c?... | mv .. casts.c endian.c ptr.c signed-unsigned-representation.c signed-unsigned.c test-hard-link.c use-__thread.c?... | ||
</code> | </code> | ||
- | Cu ajutorul opțiunii ''%%-p%%'' am putut să observăm că comanda nu are sintaxa dorită și am anulat execuția ei. Problema este că avem destinația (''%%..%%'') înaintea arhivelor care trebuie mutate. | + | Cu ajutorul opțiunii ''%%-p%%'' am putut să observăm că comanda nu are sintaxa dorită și am anulat execuția ei. Problema este că avem destinația (''%%..%%'') înaintea fișierelor care trebuie mutate, iar destinația pentru ''%%mv%%'' trebuie să fie la final. |
Pentru a rezolva această problemă folosim opțiunea ''%%-I str%%'', ca mai jos: | Pentru a rezolva această problemă folosim opțiunea ''%%-I str%%'', ca mai jos: | ||
Line 243: | Line 243: | ||
==== Redirectări ==== | ==== Redirectări ==== | ||
- | Majoritatea utilitarelor pe care le folosim afișează rezultatele operațiilor pe care le aplică la ieșirea standard, adică pe ecran. În continuare vom aprofunda ceea ce am discutat despre redirectări în capitolul **Lucrul cu Fișiere**. Anterior am mai menționat și termenul de intrare standard; în această secțiune ne vom clarifica ce înseamnă, ce rol îndeplinesc și cum ne folosim de aceste cunoștințe. | + | Majoritatea utilitarelor pe care le folosim afișează rezultatele operațiilor pe care le aplică la ieșirea standard, adică pe ecran. În continuare vom aprofunda ceea ce am discutat despre redirectări în laboratorul **Lucrul cu Fișiere**. Anterior am mai menționat și termenul de intrare standard; în această secțiune ne vom clarifica ce înseamnă, ce rol îndeplinesc și cum ne folosim de aceste cunoștințe. |
Orice proces folosește implicit trei fluxuri (streams) de date: | Orice proces folosește implicit trei fluxuri (streams) de date: | ||
Line 251: | Line 251: | ||
* **STDERR** - fluxul de ieșire standard al erorilor. Un program corect scris o să scrie erorile în fluxul de ieșire al erorilor. Acest lucru permite filtrarea erorilor. | * **STDERR** - fluxul de ieșire standard al erorilor. Un program corect scris o să scrie erorile în fluxul de ieșire al erorilor. Acest lucru permite filtrarea erorilor. | ||
- | În linie de comandă, atât STDOUT cât și STDERR vor apărea pe ecran. Datorită faptului că informațiile sunt scrise în două fluxuri distincte, utilizatorul are posibilitatea de a separa rezultatele de erori. Utilizatorul face aceasta folosind redirectări. | + | În linia de comandă, atât STDOUT cât și STDERR vor apărea pe ecran. Datorită faptului că informațiile sunt scrise în două fluxuri distincte, utilizatorul are posibilitatea de a separa rezultatele de erori. Utilizatorul face aceasta folosind redirectări. |
=== Redirectarea ieșirilor standard === | === Redirectarea ieșirilor standard === | ||
Line 306: | Line 306: | ||
Observăm că am folosit sintaxa ''%%2> errs%%'' pentru a redirecta erorile în fișierul **errs**. Observăm că pentru a redirecta ieșirea standard putem omite descriptorul de fișier, așa cum am făcut cu ''%%> out%%''. | Observăm că am folosit sintaxa ''%%2> errs%%'' pentru a redirecta erorile în fișierul **errs**. Observăm că pentru a redirecta ieșirea standard putem omite descriptorul de fișier, așa cum am făcut cu ''%%> out%%''. | ||
- | Atunci când rulăm o comandă, redirectăm erorile într-un fișier pentru că vrem să verificăm că totul s-a executat cu succes. De cele mai multe ori suntem în rumătorul scenariu: | + | Atunci când rulăm o comandă, redirectăm erorile într-un fișier pentru că vrem să verificăm că totul s-a executat cu succes. De cele mai multe ori suntem în următorul scenariu: |
- Urmează să executăm o comandă care durează mai mult timp și pentru care nu putem să ținem pasul, cu ochiul liber, cu fluxul de afișare a datelor pe ecran. Un exemplu este compilarea unui proiect mai mare. | - Urmează să executăm o comandă care durează mai mult timp și pentru care nu putem să ținem pasul, cu ochiul liber, cu fluxul de afișare a datelor pe ecran. Un exemplu este compilarea unui proiect mai mare. |