Differences

This shows you the differences between two versions of the page.

Link to this comparison view

uso:laboratoare:laborator-06:inspect-shell [2022/11/07 15:48]
iustina.caramida [Înlănțuirea comenzilor folosind operatorul | (pipe)]
uso:laboratoare:laborator-06:inspect-shell [2023/11/07 19:59] (current)
maria_irina.gherman [Execuția comenzilor]
Line 3: Line 3:
 ===== Configurarea shellului Bash ===== ===== Configurarea shellului Bash =====
  
-Așa cum am menționat în secțiunea Configurarea rulării ​aplicațiilor,​ modul în care o aplicație rulează este configurabil. Fișierul de configurare al shellului **Bash** este ''​%%~/​.bashrc%%''​. În directorul home al fiecărui utilizator se găsește un fișier ''​%%.bashrc%%''​ pentru a le permite utilizatorilor să își personalizeze comportamentul shellului lor Bash, fără a intra în conflict cu configurările Bash ale altor utilizatori din sistem. Atunci când un utilizator pornește un shell Bash, conținutul fișierului ''​%%~/​.bashrc%%''​ este citit și sunt aplicate configurările specifice utilizatorului.+Așa cum am menționat în laboratorul **Instalarea și utilizarea ​aplicațiilor**, modul în care o aplicație rulează este configurabil. Fișierul de configurare al shellului **Bash** este ''​%%~/​.bashrc%%''​. În directorul home al fiecărui utilizator se găsește un fișier ''​%%.bashrc%%''​pentru a le permite utilizatorilor să își personalizeze comportamentul shellului lor Bash, fără a intra în conflict cu configurările Bash ale altor utilizatori din sistem. Atunci când un utilizator pornește un shell Bash, conținutul fișierului ''​%%~/​.bashrc%%''​ este citit și sunt aplicate configurările specifice utilizatorului.
  
-Shellul //Bash//, ca majoritatea programelor,​ vine cu un set de configurări implicite (default), care nu sunt pe placul tuturor utilizatorilor. Prin fișierul ''​%%.bashrc%%''​ utilizatorul poate modifica setul default astfel încât să se potrivească cu stilul său: un exemplu des întâlnit este modificarea dimensiunii istoricului de comenzi. +Shellul //Bash//, ca majoritatea programelor,​ vine cu un set de configurări implicite (default), care pot să nu fie pe placul tuturor utilizatorilor. Prin fișierul ''​%%.bashrc%%''​ utilizatorul poate modifica setul default astfel încât să se potrivească cu stilul său: un exemplu des întâlnit este modificarea dimensiunii istoricului de comenzi.
- +
-==== Modificarea dimensiunii istoricului ==== +
- +
-Inspectăm conținutul fișierului ''​%%~/​.bashrc%%''​ folosind comanda următoare:​ +
- +
-<code bash> +
-student@uso:​~$ less ~/.bashrc +
-</​code>​ +
-În sesiunea interactivă ''​%%less%%''​ căutăm după cuvântul ''​%%HISTSIZE%%'':​ +
- +
-<code bash> +
-[...] +
-# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +
-HISTSIZE=1000 +
-HISTFILESIZE=2000 +
-[...] +
-</​code>​ +
-Shellul Bash reține istoricul de comenzi în fișierul ''​%%~/​.bash_history%%''​ din directorul home al fiecărui utilizator. Valorile variabilelor ''​%%HISTSIZE%%''​ și ''​%%HISTFILESIZE%%''​ limitează numărul maxim de comenzi, respectiv linii, din fișierul ''​%%~/​.bash_history%%''​. Dacă vrem să avem un istoric nelimitat putem seta valoarea variabilelor la un număr negativ. +
- +
-**Exercițiu**:​ Deschideți fișierul ''​%%~/​.bashrc%%''​ în editorul preferat și atribuiți valoarea ''​%%-1%%''​ pentru ''​%%HISTSIZE%%''​ și ''​%%HISTFILESIZE%%''​. Salvați modificările făcute. +
- +
-<note warning>​ +
-Atenție! **Nu** trebuie să existe spațiu între numele variabilei, ''​%%=%%''​ și valoarea atribuită. +
-</​note>​ +
- +
-<note tip> +
-Pentru a afla mai multe despre valorile ''​%%HISTSIZE%%''​ și ''​%%HISTFILESIZE%%''​ accesați pagina de manual a shellului Bash (''​%%man bash%%''​) și căutați după numele variabilelor. +
-</​note>​+
  
  
Line 67: Line 39:
 alias ncal='​ncal -M alias ncal='​ncal -M
 </​code>​ </​code>​
-Observăm că atât ''​%%grep%%''​ cât și ''​%%egrep%%''​ au câte un alias pentru opțiunea ''​%%--color%%'',​ care în cazul acesta evidenția expresia găsită. Putem defini un alias și pentru un typo pe care îl facem des, așa cum este cazul pentru ''​%%gti%%'',​ un alias pentru comanda ''​%%git%%''​.+Observăm că atât ''​%%grep%%''​ cât și ''​%%egrep%%''​ au câte un alias pentru opțiunea ''​%%--color%%'',​ care în cazul acesta evidențiază expresia găsită. Putem defini un alias și pentru un typo pe care îl facem des, așa cum este cazul pentru ''​%%gti%%'',​ un alias pentru comanda ''​%%git%%'',​ sau ''​%%grpe%%''​ pentru comanda ''​%%grep%%''​.
  
 O parte din aceste aliasuri sunt definite în fișierul ''​%%~/​.bashrc%%'',​ iar altele în fișierul ''​%%~/​.bash_aliases%%''​. Conținutul fișierului ''​%%~/​.bash_aliases%%''​ este inclus de către fișierul ''​%%~/​.bashrc%%''​ la pornirea shellului Bash. Astfel, pentru o organizare mai bună, este recomandat ca utilizatorul să-și definească aliasurile în fișierul ''​%%~/​.bash_aliases%%''​. O parte din aceste aliasuri sunt definite în fișierul ''​%%~/​.bashrc%%'',​ iar altele în fișierul ''​%%~/​.bash_aliases%%''​. Conținutul fișierului ''​%%~/​.bash_aliases%%''​ este inclus de către fișierul ''​%%~/​.bashrc%%''​ la pornirea shellului Bash. Astfel, pentru o organizare mai bună, este recomandat ca utilizatorul să-și definească aliasurile în fișierul ''​%%~/​.bash_aliases%%''​.
Line 101: Line 73:
 <code bash> <code bash>
 student@uso:​~$ go https://​www.google.com student@uso:​~$ go https://​www.google.com
-gnome-open: command ​not found+Command '​go' ​not found, but can be installed with: 
 +sudo snap install go         # version 1.18.7, or 
 +sudo apt  install golang-go ​ # version 2:​1.18~0ubuntu2 
 +sudo apt  install gccgo-go ​  # version 2:​1.18~0ubuntu2 
 +See 'snap info go' for additional versions.
 </​code>​ </​code>​
 Acest lucru se întâmplă din cauză că fișierul ''​%%~/​.bashrc%%''​ este citit atunci când pornim o instanță de Bash (când deschidem un terminal). Ca să recitim fișierul, și să aplicăm modificările,​ folosim comanda ''​%%source%%'',​ ca în exemplul de mai jos: Acest lucru se întâmplă din cauză că fișierul ''​%%~/​.bashrc%%''​ este citit atunci când pornim o instanță de Bash (când deschidem un terminal). Ca să recitim fișierul, și să aplicăm modificările,​ folosim comanda ''​%%source%%'',​ ca în exemplul de mai jos:
Line 109: Line 85:
 student@uso:​~$ go https://​www.google.com student@uso:​~$ go https://​www.google.com
 </​code>​ </​code>​
-Comanda ''​%%source ~/​.bashrc%%''​ a avut ca efect citirea ​și aplicarea modificărilor definite în fișierul ''​%%.bashrc%%''​ și fișierele pe care acesta le include.+Comanda ''​%%source ~/​.bashrc%%''​ a avut ca efect recitirea ​și aplicarea modificărilor definite în fișierul ''​%%.bashrc%%''​ și fișierele pe care acesta le include.
  
 ===== Execuția comenzilor ===== ===== Execuția comenzilor =====
Line 115: 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:<code bash> +  * 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ă.
-Exit status: +
-       ​0 ​     if OK, +
- +
-       ​1 ​     if minor problems (e.g., cannot access subdirectory),​ +
- +
-       ​2 ​     if serious trouble (e.g., cannot access command-line argument). +
-</​code>​+
  
 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 143: 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 ​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 149: 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:​
  
-<​HTML><​ul></​HTML>​ +Operatorul ''​%%;​%%''​ - este folosit pentru separarea comenzilorUrmăm exemplul de mai jos: 
-<​HTML><​li></​HTML><​HTML><​p></​HTML>​Operatorul ''​%%;​%%''​ - este folosit pentru separarea comenzilor Urmăm exemplul de mai jos:<​HTML></​p></​HTML>​+
 <code bash> <code bash>
 student@uso:​~$ mkdir demo; cd demo; touch Hello; ls student@uso:​~$ mkdir demo; cd demo; touch Hello; ls
 Hello Hello
 </​code>​ </​code>​
-<​HTML><​p></​HTML>​În exemplul de mai sus am creat directorul ''​%%demo%%'',​ am navigat în interiorul său, am creat fișierul ''​%%Hello%%''​ și am afișat conținutul directorului. Am făcut toate acestea înlănțuind comenzile ''​%%mkdir%%'',​ ''​%%cd%%'',​ ''​%%touch%%''​ și ''​%%ls%%''​ cu ajutorul operatorului ''​%%;​%%''​.<​HTML></​p></​HTML>​ + 
-<​HTML><​p></​HTML>​Operatorul ''​%%;​%%''​ este folosit pentru separarea comenzilor, dar nu ține cont dacă comenzile anterioare au fost executate cu succes sau nu. Urmăm exemplul de mai jos:<​HTML></​p></​HTML>​+În exemplul de mai sus am creat directorul ''​%%demo%%'',​ am navigat în interiorul său, am creat fișierul ''​%%Hello%%''​ și am afișat conținutul directorului. Am făcut toate acestea înlănțuind comenzile ''​%%mkdir%%'',​ ''​%%cd%%'',​ ''​%%touch%%''​ și ''​%%ls%%''​ cu ajutorul operatorului ''​%%;​%%''​. 
 + 
 +Operatorul ''​%%;​%%''​ este folosit pentru separarea comenzilor, dar nu ține cont dacă comenzile anterioare au fost executate cu succes sau nu. Urmăm exemplul de mai jos: 
 <code bash> <code bash>
 student@uso:​~$ mkdir operators/​demo;​ cd operators/​demo student@uso:​~$ mkdir operators/​demo;​ cd operators/​demo
Line 166: Line 138:
 -bash: cd: operators/​demo:​ No such file or directory -bash: cd: operators/​demo:​ No such file or directory
 </​code>​ </​code>​
-<​HTML><​p></​HTML>​Î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%%''​.<​HTML></​p></​HTML>​ + 
-<​HTML><​p></​HTML>​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.<​HTML></​p></​HTML><​HTML></​li></​HTML>​ +Î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șuatdeoarece nu există calea ''​%%operators/​demo%%''​. 
-<​HTML><​li></​HTML><​HTML><​p></​HTML>​Operatorul binar ''​%%&&​%%''​ (și logic) - execută a doua comandă doar dacă precedenta s-a executat cu succes. Exemplul anterior devine:<​HTML></​p></​HTML>​+ 
 +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: 
 <code bash> <code bash>
 student@uso:​~$ mkdir operators/​demo && cd operators/​demo student@uso:​~$ mkdir operators/​demo && cd operators/​demo
 mkdir: cannot create directory ‘operators/​demo’:​ No such file or directory mkdir: cannot create directory ‘operators/​demo’:​ No such file or directory
 </​code>​ </​code>​
-<​HTML><​p></​HTML>​Observăm că din moment ce comanda ''​%%mkdir%%''​ a eșuat, comanda ''​%%cd%%''​ nu a mai fost executată.<​HTML></​p></​HTML><​HTML></​li></​HTML>​ + 
-<​HTML><​li></​HTML><​HTML><​p></​HTML>​Operatorul binar ''​%%||%%''​ (sau logic) - execută a doua comandă doar dacă prima s-a terminat cu eșec. Urmărim exemplul de mai jos:<​HTML></​p></​HTML>​+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: 
 <code bash> <code bash>
 student@uso:​~$ (ls -d operators || mkdir operators) && ls -d operators student@uso:​~$ (ls -d operators || mkdir operators) && ls -d operators
Line 183: Line 162:
 operators operators
 </​code>​ </​code>​
-<​HTML><​p></​HTML>​În exemplul de mai sus, prima comandă ''​%%ls%%''​ a eșuat, așa că a fost executată comanda ''​%%mkdir%%''​ și apoi a fost executată ultima comandă ''​%%ls%%''​. La cea de-a doua rulare, a fost executată cu succes prima comandă ''​%%ls%%'',​ așa că comanda ''​%%mkdir%%''​ nu a mai fost executată, și apoi a fost executată ultima comandă ''​%%ls%%''​.<​HTML></​p></​HTML><​HTML></​li></​HTML><​HTML></​ul></​HTML>​+ 
 +În exemplul de mai sus, prima comandă ''​%%ls%%''​ a eșuat, așa că a fost executată comanda ''​%%mkdir%%''​ și apoi a fost executată ultima comandă ''​%%ls%%''​. La cea de-a doua rulare, a fost executată cu succes prima comandă ''​%%ls%%'',​ așa că comanda ''​%%mkdir%%''​ nu a mai fost executată, și apoi a fost executată ultima comandă ''​%%ls%%''​.
  
 Pentru a rezolva scenariul de la care am plecat inițial, putem rula: Pentru a rezolva scenariul de la care am plecat inițial, putem rula:
Line 192: Line 172:
 Comanda de mai sus va actualiza indexul pachetelor sursă, va instala pachetul ''​%%cowsay%%''​ și va rula comanda ''​%%cowsay%%''​ pentru a valida instalarea. O astfel de înlănțuire de comenzi este numită **oneliner**. Comanda de mai sus va actualiza indexul pachetelor sursă, va instala pachetul ''​%%cowsay%%''​ și va rula comanda ''​%%cowsay%%''​ pentru a valida instalarea. O astfel de înlănțuire de comenzi este numită **oneliner**.
  
-=== Exerciții === 
- 
-  - Scrieți un oneliner cu ajutorul căruia descărcați arhiva tar de la adresa TODO, creați directorul ''​%%~/​operators/​demo/​tar%%''​ și apoi dezarhivați conținutul în directorul creat. 
-  - Actualizați onelinerul anterior astfel încât, după dezarhivare,​ să pornească compilarea proiectului folosind comanda ''​%%make build%%''​. 
  
 ==== Înlănțuirea comenzilor folosind operatorul | (pipe) ==== ==== Înlănțuirea comenzilor folosind operatorul | (pipe) ====
Line 224: 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ă acumam 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 239: 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 arhivele ​''​%%.tar%%''​ în directorul ''​%%archives%%'':​+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 onelinerulpentru 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>
-student@uso:​~$ ls *.tar | xargs -p mv archives +student@uso:​~/​uso-lab/​labs/​06-scripting/​support/​02-one-liners/​rename/​src$ ls *.| xargs -p mv .. 
-mv archives courses.tar labhidden.tar uso.tar wiki.tar ?...n+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 (''​%%archives%%''​) î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:
  
 <code bash> <code bash>
-student@uso:​~$ ls *.tar | xargs -I str -p mv str archives +student@uso:​~/​uso-lab/​labs/​06-scripting/​support/​02-one-liners/​rename/​src$ ls *.| xargs -I str -p mv str .. 
-mv courses.tar archives ​?...n +mv casts.c ..?...n 
-mv labhidden.tar archives ​?...n +mv endian.c ..?...n 
-mv uso.tar archives ​?...n +mv ptr.c ..?...n 
-mv wiki.tar archives ​?...n+mv signed-unsigned-representation.c ..?...n 
 +mv signed-unsigned.c ..?...n 
 +mv test-hard-link.c ..?...n 
 +mv use-__thread.c ..?​...n ​
 </​code>​ </​code>​
-Opțiunea ''​%%-I%%''​ va înlocui șirul de caractere ''​%%str%%''​ cu numele arhivelor primite din pipe, așa cum observăm mai sus. Șirul de caractere placeholder poate să fie orice, nu neapărat ''​%%str%%'';​ comanda ''​%%ls *.tar | xargs -I {} -p mv {} archives%%''​ produce aceelași rezultat.+Opțiunea ''​%%-I%%''​ va înlocui șirul de caractere ''​%%str%%''​ cu numele arhivelor primite din pipe, așa cum observăm mai sus. Șirul de caractere placeholder poate să fie orice, nu neapărat ''​%%str%%'';​ comanda ''​%%ls *.| xargs -I {} -p mv {} ..%%''​ produce aceelași rezultat. 
 + 
 +<​note>​ 
 +Acum înțelegem cum funcționează operatorul ''​%%|%%''​ (pipe). Acesta conectează fluxul de ieșire (STDOUT) al comenzii din stânga sa cu fluxul de intrare (STDIN) al comenzii din dreapta. 
 +</​note>​
  
 ==== 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 268: 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 282: Line 265:
 Pentru a redirecta ieșirea standard folosim sintaxa ''​%%cmd 1> nume-fișier%%''​. Pentru a redirecta ieșirea standard a erorilor folosim sintaxa ''​%%cmd 2> nume-fișier%%''​. Pentru a redirecta ieșirea standard folosim sintaxa ''​%%cmd 1> nume-fișier%%''​. Pentru a redirecta ieșirea standard a erorilor folosim sintaxa ''​%%cmd 2> nume-fișier%%''​.
  
-Warning +<note warning>
- +
 **Atenție!** În cazul în care fișierul destinație nu există, operatorul ''​%%>​%%''​ îl va crea. Dacă fișierul destinație există, operatorul ''​%%>​%%''​ va șterge conținutul acestuia. **Atenție!** În cazul în care fișierul destinație nu există, operatorul ''​%%>​%%''​ îl va crea. Dacă fișierul destinație există, operatorul ''​%%>​%%''​ va șterge conținutul acestuia.
 +</​note>​
  
  
Line 314: Line 296:
 student@uso:​~$ cat out student@uso:​~$ cat out
 Desktop: Desktop:
-todos.txt 
  
 Documents: Documents:
 snippets.git snippets.git
-uni 
-uso.tar 
  
 Downloads: Downloads:
-courses.tar 
-uso.tar 
 student@uso:​~$ cat errs student@uso:​~$ cat errs
 ls: cannot access '​F*':​ No such file or directory ls: cannot access '​F*':​ No such file or directory
Line 329: 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.
Line 335: Line 312:
   - În timpul cât rulează noi putem să facem altceva: ne ocupăm de altă sarcină, ne facem o cafea, etc.   - În timpul cât rulează noi putem să facem altceva: ne ocupăm de altă sarcină, ne facem o cafea, etc.
   - La finalul execuției inspectăm fișierele ''​%%out%%''​ și ''​%%err%%''​ pentru a vedea dacă au existat erori și le rezolvăm.   - La finalul execuției inspectăm fișierele ''​%%out%%''​ și ''​%%err%%''​ pentru a vedea dacă au existat erori și le rezolvăm.
- 
-Note 
- 
- 
-Acum înțelegem cum funcționează operatorul ''​%%|%%''​ (pipe). Acesta conectează fluxul de ieșire (STDOUT) al comenzii din stânga sa cu fluxul de intrare (STDIN) al comenzii din dreapta. 
- 
  
 === Redirectarea în mod append === === Redirectarea în mod append ===
Line 346: Line 317:
 Implicit, operatorul ''​%%>​%%''​ șterge (trunchează) conținutul fișierului destinație. Dacă vrem să păstrăm conținutul fișierului și să adăugăm rezultatul redirectării în continuarea acestuia, folosim operatorul ''​%%>>​%%''​. Implicit, operatorul ''​%%>​%%''​ șterge (trunchează) conținutul fișierului destinație. Dacă vrem să păstrăm conținutul fișierului și să adăugăm rezultatul redirectării în continuarea acestuia, folosim operatorul ''​%%>>​%%''​.
  
-Rulați din nou exemplele de mai sus folosind operatorul ''​%%>>​%%''​ în locul operatorului ''​%%>​%%''​. Folosiți less pentru a inspecta fișierele de ieșire și de erori.+**Exercitiu:​** ​Rulați din nou exemplele de mai sus folosind operatorul ''​%%>>​%%''​ în locul operatorului ''​%%>​%%''​. Folosiți less pentru a inspecta fișierele de ieșire și de erori.
  
 === Redirectarea erorilor la ieșirea standard === === Redirectarea erorilor la ieșirea standard ===
Line 367: Line 338:
 === Fișiere speciale === === Fișiere speciale ===
  
-Pe sistemele Linux găsim un număr de fișiere speciale pe care le putem folosim ​în diferite scopuri:+Pe sistemele Linux găsim un număr de fișiere speciale pe care le putem folosi ​în diferite scopuri:
  
-<​HTML><​ul></​HTML>​ +Fișierul ''​%%/​dev/​null%%''​ este un fișier care ignoră orice este scris în el. Este echivalentul unei găuri negre în sistemul nostru. Cu ajutorul său, putem rescrie exemplul de mai sus în modul următor:
-<​HTML><​li></​HTML><​HTML><​p></​HTML>​Fișierul ''​%%/​dev/​null%%''​ este un fișier care ignoră orice este scris în el. Este echivalentul unei găuri negre în sistemul nostru. Cu ajutorul său, putem rescrie exemplul de mai sus în modul următor:<​HTML></​p></​HTML>​+
 <code bash> <code bash>
 student@uso:​~$ firefox &> /dev/null & student@uso:​~$ firefox &> /dev/null &
Line 377: Line 347:
 [2] 10595 [2] 10595
 </​code>​ </​code>​
-<​HTML><​p></​HTML>​Acum orice va genera ''​%%firefox%%''​ va fi scris în ''​%%/​dev/​null%%'',​ care va consuma textul primit fără a ocupa spațiu pe disc.<​HTML></​p></​HTML><​HTML></​li></​HTML>​ +Acum orice va genera ''​%%firefox%%''​ va fi scris în ''​%%/​dev/​null%%'',​ care va consuma textul primit fără a ocupa spațiu pe disc. 
-<​HTML><​li></​HTML><​HTML><​p></​HTML>​Fișierul ''​%%/​dev/​zero%%''​ este un generator de octeți. Acesta generează atâția octeți cu valoarea zero (**0**)((<​HTML><​p></​HTML>​Valoarea **0** nu înseamnă cifra **0**. Valoarea **0** înseamnă caracterul **(null)** din tabelul [[http://​www.asciitable.com/​|ASCII]]. Caracterul **0** are valoarea **48** în tabelul ASCII.<​HTML></​p></​HTML>​)) cât îi sunt ceruți. Urmăm exemplul:<​HTML></​p></​HTML>​+ 
 +Fișierul ''​%%/​dev/​zero%%''​ este un generator de octeți. Acesta generează atâția octeți cu valoarea zero (**0**)((<​HTML><​p></​HTML>​Valoarea **0** nu înseamnă cifra **0**. Valoarea **0** înseamnă caracterul **(null)** din tabelul [[http://​www.asciitable.com/​|ASCII]]. Caracterul **0** are valoarea **48** în tabelul ASCII.<​HTML></​p></​HTML>​)) cât îi sunt ceruți. Urmăm exemplul:
 <code bash> <code bash>
 student@uso:​~$ cat /dev/zero | xxd student@uso:​~$ cat /dev/zero | xxd
Line 393: Line 364:
 ^C ^C
 </​code>​ </​code>​
-<​HTML><​p></​HTML>​Deoarece citim din generator, comanda ''​%%cat%%''​ va afișa o infinitate de octeți cu valoarea zero. Utilitarul ''​%%xxd%%''​ afișează în hexazecimal textul primit la STDIN. Trecem rezultatul lui ''​%%cat%%''​ prin ''​%%xxd%%''​ deoarece valoarea **0** nu este un caracter printabil. Cu alte cuvinte nu este un caracter obișnuit, ca cele de pe tastatură, deoarece nu are un echivalent grafic. Folosim ''​%%Ctrl+c%%''​ pentru a opri execția.<​HTML></​p></​HTML>​ +Deoarece citim din generator, comanda ''​%%cat%%''​ va afișa o infinitate de octeți cu valoarea zero. Utilitarul ''​%%xxd%%''​ afișează în hexazecimal textul primit la STDIN. Trecem rezultatul lui ''​%%cat%%''​ prin ''​%%xxd%%''​ deoarece valoarea **0** nu este un caracter printabil. Cu alte cuvinte nu este un caracter obișnuit, ca cele de pe tastatură, deoarece nu are un echivalent grafic. Folosim ''​%%Ctrl+c%%''​ pentru a opri execția. 
-<​HTML><​p></​HTML>​**Exercițiu**:​ Rulați comanda ''​%%cat /​dev/​zero%%''​ pentru a înțelege nevoia utilitarului ''​%%xxd%%''​ din exemplul de mai sus.<​HTML></​p></​HTML>​ + 
-<​HTML><​blockquote>​ +**Exercițiu**:​ Rulați comanda ''​%%cat /​dev/​zero%%''​ pentru a înțelege nevoia utilitarului ''​%%xxd%%''​ din exemplul de mai sus. 
-<HTML><​ul></​HTML+ 
-<​HTML><​li></​HTML>​Fișierul ''​%%/​dev/​urandom%%''​ este un alt generator de octeți.<​HTML></​li></​HTML><​HTML></​ul></​HTML>​ +<note tip
-</​blockquote></​HTML>​ +Fișierul ''​%%/​dev/​urandom%%''​ este un alt generator de octeți. Acesta generează atâția octeți cu valoare random cât îi sunt ceruți. 
-<​HTML><​p></​HTML>​Acesta generează atâția octeți cu valoare random cât îi sunt ceruți.<​HTML>​</p></​HTML+</note
-<​HTML><​p></​HTML>​**Exercițiu**:​ Rulați comenzile din exemplul anterior, dar acum citiți din ''​%%/​dev/​urandom%%''​.<​HTML></​p></​HTML><​HTML></​li></​HTML><​HTML></​ul></​HTML>​+ 
 +**Exercițiu**:​ Rulați comenzile din exemplul anterior, dar acum citiți din ''​%%/​dev/​urandom%%''​.
  
 Generatoarele de octeți sunt utile pentru a testa aplicațiile pe care le dezvoltăm. Majoritatea aplicațiilor pe care le vom scrie, ca și cele pe care le utilizăm, citesc și prelucrează informații. Testăm o aplicație pentru că vrem să verificăm că nu avem buguri. Pentru aceasta putem să folosim seturi de date de intrare cât mai variate și mai aleatoare, adică inputuri random. Folosim utilitarul ''​%%dd%%''​ pentru a genera un fișier de 100 MB cu octeți random, ca în exemplul de mai jos: Generatoarele de octeți sunt utile pentru a testa aplicațiile pe care le dezvoltăm. Majoritatea aplicațiilor pe care le vom scrie, ca și cele pe care le utilizăm, citesc și prelucrează informații. Testăm o aplicație pentru că vrem să verificăm că nu avem buguri. Pentru aceasta putem să folosim seturi de date de intrare cât mai variate și mai aleatoare, adică inputuri random. Folosim utilitarul ''​%%dd%%''​ pentru a genera un fișier de 100 MB cu octeți random, ca în exemplul de mai jos:
Line 421: Line 393:
 **Exercițiu**:​ Folosiți fișierul generat și utilitarul ''​%%tar%%''​ pentru a testa diferite metode de compresie a arhivelor. Creați câte o arhivă pentru fiecare din următoarele opțiuni de compresie: **Z** (compress), **z** (gzip) și **j** (bzip2). Comparați dimensiunile arhivelor obținute. **Exercițiu**:​ Folosiți fișierul generat și utilitarul ''​%%tar%%''​ pentru a testa diferite metode de compresie a arhivelor. Creați câte o arhivă pentru fiecare din următoarele opțiuni de compresie: **Z** (compress), **z** (gzip) și **j** (bzip2). Comparați dimensiunile arhivelor obținute.
  
-Note +<​note>​
- +
 Un caz uzual de utilizare a ''​%%dd%%''​ este suprascrierea unui disc cu informații aleatoare. Această metodă este utilizată ca o formă de securitate atunci când vrem să ștergem informații de pe un disc. Astfel suprascriem datele șterse pentru a preveni posibilitatea recuperării datelor de pe disc. Mai multe informații găsiți [[https://​uwnthesis.wordpress.com/​2014/​07/​26/​kali-how-to-use-dd-to-wipe-your-usb-pen-the-visual-guide/​|aici]]. Un caz uzual de utilizare a ''​%%dd%%''​ este suprascrierea unui disc cu informații aleatoare. Această metodă este utilizată ca o formă de securitate atunci când vrem să ștergem informații de pe un disc. Astfel suprascriem datele șterse pentru a preveni posibilitatea recuperării datelor de pe disc. Mai multe informații găsiți [[https://​uwnthesis.wordpress.com/​2014/​07/​26/​kali-how-to-use-dd-to-wipe-your-usb-pen-the-visual-guide/​|aici]].
 +</​note>​
  
 === Exerciții === === Exerciții ===
Line 431: Line 401:
   - Afișați primele zece procese sortate în funcție de memoria ocupată (Hint: RSS). Nu uitați să includeți antetul. Redirectați rezultatul în fișierul **top10-rss-consumers**. Modificați comanda astfel încât rezultatul redirectării să nu șteargă conținutul existent.   - Afișați primele zece procese sortate în funcție de memoria ocupată (Hint: RSS). Nu uitați să includeți antetul. Redirectați rezultatul în fișierul **top10-rss-consumers**. Modificați comanda astfel încât rezultatul redirectării să nu șteargă conținutul existent.
   - Afișați ultimele zece procese sortate în funcție de utilizarea procesorului (Hint: CPU). Nu uitați să includeți antetul. Redirectați rezultatul în fișierul **top10-cpu-consumers**. Modificați comanda astfel încât rezultatul redirectării să nu șteargă conținutul existent.   - Afișați ultimele zece procese sortate în funcție de utilizarea procesorului (Hint: CPU). Nu uitați să includeți antetul. Redirectați rezultatul în fișierul **top10-cpu-consumers**. Modificați comanda astfel încât rezultatul redirectării să nu șteargă conținutul existent.
- 
-**Note de subsol** 
- 
  
uso/laboratoare/laborator-06/inspect-shell.1667828888.txt.gz · Last modified: 2022/11/07 15:48 by iustina.caramida
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0