User Tools

Site Tools


basic-unix:capitole:capitol-03

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
basic-unix:capitole:capitol-03 [2016/05/23 11:11]
razvan [Utilitare folosite]
basic-unix:capitole:capitol-03 [2016/05/23 12:02] (current)
razvan
Line 1: Line 1:
 ====== 3. Interfața în linia de comandă ====== ====== 3. Interfața în linia de comandă ======
  
-TODO+Interfața în linia de comandă este forma cea mai "​portabilă"​ de folosire a unui sistem Linux/Unix. Interfața în linia de comandă, deși mai greu de folosit decât interfața grafică, are avantajul că se prezintă în aceeași formă pe toate sistemele Unix/Linux. În plus este foarte ușor extensibilă (se pot adăuga comenzi noi sau opțiuni noi la parametri) și se pot automatiza acțiuni folosind (shell) scripting.
  
 ===== Subiecte abordate ===== ===== Subiecte abordate =====
Line 58: Line 58:
 Codul de eroare al unei comenzi Codul de eroare al unei comenzi
  
-==== TODO 2 ====+==== Copy-paste în terminal ​====
  
-TODO+După ce ați deschis terminalul dați următoarea comandă (nu trebuie să înțelegeți acum ce face): 
 +<code bash> 
 +cat /​dev/​urandom | tr -dc _A-Z-a-z-0-9 | head -c 33 && echo -ne "​\n"​ 
 +</​code>​ 
 + 
 +Cum dăm Copy&​Paste într-un terminal? 
 +  * Copy: ''​**Ctrl+Insert**''​ (valabil în orice terminal. În Ubuntu mai poate fi folosită și combinația ''​**Ctrl+Shift+c**''​) 
 +  * Paste: ''​**Shift+Insert**''​ (valabil în orice terminal. În Ubuntu mai poate fi folosită și combinația ''​**Ctrl+Shift+v**''​ 
 + 
 +Am dat o comandă lungă pe care vreau să o mai dau o dată. Cum fac? 
 +  * **R**: apasă ''​uparrow''​ (săgeată sus) 
 + 
 +Vreau să copiez o comandă din terminal fără a folosi mouse-ul. Cum fac? 
 +  * **R**: Folosim săgeată sus pentru a prelua comanda lungă anterioară. Apoi vom folosi ''​**Ctrl+a**''​ pentru a ne duce la începutul rândului. Apoi apăsăm ''​**Ctrl+k**''​ pentru a copia toată linia. Observăm că a dispărut. Acum apăsăm ''​**Ctrl+y**''​ (yank). 
 + 
 +==== Prompt-ul și comenzi simple ==== 
 + 
 +Rulați comanda ''​whoami''​. Ce v-a afișat? Care este utilizatorul curent și care este numele mașinii? 
 + 
 +Rulați comanda ''​hostname''​ și observați ce afișează. 
 + 
 +Rulați comanda ''​sudo su''​. Verificați din nou utilizatorul curent cu comanda ''​whoami''​. 
 + 
 +Părăsiți prompt-ul de ''​root''​ folosind comanda ''​exit''​ sau combinația de taste ''​Ctrl+d''​. 
 + 
 +==== Comenzi rulate de root ==== 
 + 
 +Rulați, ca utilizator obișnuit, comanda 
 +<​code>​ 
 +ifconfig 
 +</​code>​ 
 +Observați că nu afișează nimic. 
 + 
 +Apoi, rulați ''​sudo su''​ ca să obțineți un prompt de ''​root''​ și rulați și acolo comanda 
 +<​code>​ 
 +ifconfig 
 +</​code>​ 
 +Observați că acum afișează informații despre rețea. 
 + 
 +Pentru a identifica această cauză, rulați, în fiecare dintre cele două prompturi (de utilizator obișnuit și de ''​root''​) cele două comenzi de mai jos 
 +<​code>​ 
 +echo $PATH 
 +which ifconfig 
 +</​code>​ 
 + 
 +==== Comenzi cu argumente ==== 
 + 
 +Aflați informații despre Linux-ul instalat folosind comanda ''​uname''​ cu parametrul (flag-ul) ''​-a''​ sau {{{--all}}}. Ce alte flag-uri are comanda ''​uname''?​ 
 + 
 +Rulați comanda ''​zip''​. Merge fără a avea vreun argument? 
 + 
 +Creați două fișiere cu comanda ''​touch''​. ''​touch''​ primește ca argumente (număr variabil de argumente) numele fișierelor. Rulati comanda 
 +<​code>​ 
 +touch file1 file2 file3 
 +</​code>​ 
 + 
 +Arhivați fișierele //file1// și //file2// într-o arhivă //​files.zip//​. Comanda 
 +<​code>​ 
 +zip files.zip file1 file2 
 +</​code>​ 
 + 
 +Rulati comanda ''​zip''​ fără parametri și observați flag-ul de "quiet operation"​. 
 + 
 +Rulați comanda ''​zip''​ cu flag-ul ''​-q''​ pentru a adăuga și fișierul //file3// la arhivă. Adică rulați 
 +<​code>​ 
 +zip -q files.zip file3 
 +</​code>​ 
 + 
 +==== Documentație ==== 
 + 
 +Aflați ce face comanda ''​who''​ folosind utilitarul ''​whatis'':​ ''​whatis who''​. Ce argumente poate primi comanda ''​who''?​ 
 + 
 +<note tip> 
 +Folosiți help-ul intern al comenzii: {{{who --help}}}. 
 +</​note>​ 
 + 
 +Similar, aflați ce face comanda ''​last''​. 
 + 
 +Rulați comanda 
 +<​code>​ 
 +id 
 +</​code>​ 
 + 
 +Pentru a afișa informații despre utilizatorul curent. Folosiți opțiunea pentru a afișa doar UID-ul utilizatorului. La fel, folosiți opțiunea pentru a afișa doar GID-urile grupurilor din care face parte utilizatorul. 
 + 
 +==== Rulare vimtutor ==== 
 + 
 +Rulați comanda ''​vimtutor''​ pentru a vă acomoda cu editorul Vim. 
 + 
 +==== Scriere program C în Vim și compilare ==== 
 + 
 +Deschideți un terminal. Dorim să ne asigurăm că suntem în directorul ''/​home/​training''​. Folosiți comanda  
 + 
 +<code bash>  
 +pwd 
 +</​code>​ 
 + 
 +Folosiți comanda ''​vim hello.c''​ pentru a edita un fișier C care afișează mesajul ''​Hello,​ World!''​. Puteți folosi programul de mai jos: 
 + 
 +<code C> 
 +#include <​stdio.h>​ 
 + 
 +int main(void) 
 +
 + puts("​Hello,​ World!"​);​ 
 + return 0; 
 +
 +</​code>​ 
 + 
 +Compilați programul scris la mai sus, folosind comanda  
 + 
 +<code bash> 
 +gcc hello.c -o hello 
 +</​code>​  
 + 
 +<note tip> 
 +Încercați să scrieți de mână, **folosind tasta TAB** comanda astfel: ''​gcc hel<​TAB>​ -o hello''​ 
 +</​note>​ 
 + 
 +Spre deosebire de Windows, unde executabilele au, în general extensia ''​.exe'',​ într-un sistem Linux fișierele executabile se numesc, în general, **binare**. ''​hello''​ este un astfel de fișier binar.  
 + 
 +Se poate rula folosind comanda  
 +<code bash> 
 +./hello 
 +</​code>​ 
 + 
 +==== Afișare mesaje la consolă ==== 
 + 
 +Pentru a afișa mesaje la consolă putem folosi comanda ''​echo'':​ 
 +<​code>​ 
 +echo Hello 
 +echo "​I'​m here"​ 
 +echo -e "​\t1\t2"​ 
 +</​code>​ 
 + 
 +==== Coduri de eroare ==== 
 + 
 +O comandă își poate termina execuția cu succes (status 0) sau cu eroare (status diferit de 0). Într-un terminal statusul cu care s-a încheiat ultima comandă lansată se poate vedea cu ajutorul comenzii: 
 +<​code>​ 
 +echo $? 
 +</​code>​ 
 + 
 +true și false sunt două programe care întotdeauna se termină cu succes, respectiv cu eroare. Testați acest lucru: 
 +<​code>​ 
 +true 
 +echo $? 
 +false 
 +echo $? 
 +</​code>​ 
 + 
 +Folosind operatorii ''&&''​ și ''​||'',​ putem rula o a doua comandă doar dacă prima s-a încheiat cu succes, respectiv eroare. Operatorii se aseamănă cu funcțiile logice AND și OR. 
 + 
 +<​code>​ 
 +true  && echo "​Success"​ 
 +false && echo "​Success"​ 
 +true  || echo "​Fail"​ 
 +false || echo "​Fail"​ 
 +</​code>​ 
 + 
 +Căutați un fișier (folosind ''​locate''​) și afișați pe ecran "​FOUND",​ în cazul în care fișierul a fost găsit. 
 + 
 + 
 +==== Globbing ==== 
 + 
 +Am văzut în secțiunea de Demo că putem folosi anumite caractere ce țin locul unor bucăți de text, de exemplu caracterul ''​*''​. De exemplu, dacă dorim să listăm toate fișierele din ''/​etc''​ care încep cu stringul ''​ssh''​ putem folosi comanda: 
 + 
 +<code bash> 
 +student@uso:​~$ ls /etc/ssh* 
 +</​code>​ 
 + 
 +După cum observați, caracterul ''​*''​ ține loc pentru %%"​oricâte și orice caractere"​%%. Procedați asemănător și afișați fișierele sau directoarele din ''/​etc''​ cu extensia ''​.conf''​.  
 + 
 +Realizați o arhivă de tipul ''​zip''​ în directorul ''​home''​ al utilizatorului ''​student''​ (''/​home/​student''​) care să conțină toate fișierele și directoarele din ''/​etc/''​ care conțin stringul ''​conf''​ în numele lor. 
 + 
 +<note tip> 
 +Este foarte probabil ca printre fișierele și directoarele găsite să existe directoare care nu sunt goale. Pentru a arhiva și conținutul acestora trebuie să specificăm acest lucru explicit comenzii ''​zip''​. Căutați în output-ul comenzii 
 +<​code>​ 
 +zip --help 
 +</​code>​ 
 +după opțiunea care trece recursiv prin directoare (//recurse into directories//​). 
 +</​note>​ 
 + 
 +Comanda ''​unzip''​ dezarhivează o arhivă ''​.zip''​ dar are și o opțiunea de listare a conținutului acelei arhive fără a o dezarhiva însă. Identificați acea opțiune. 
 + 
 +==== Lucrul cu fișiere ==== 
 + 
 +Creați trei fișiere, denumite ''​unu'',​ ''​doi''​ și ''​trei''​ în directorul propriu (directorul de tip home) și afişați-le folosind comanda {{{ls}}}. Adăugați apoi parametrul ''​-l''​ comenzii ''​ls''​ pentru a afișa mărimile acestor fișiere. 
 + 
 +Așteptați un minut după crearea fișierelor de mai sus. Folosiți comanda {{{touch}}} pe fișierul {{{unu}}}. Folosiți, din nou, comanda {{{ls -l}}}. Ce observați?​ 
 + 
 +Creați în directorul propriu două directoare denumite ''​dir1''​ și ''​dir2''​. Listați conținutul directoarelor. 
 + 
 +Creați fisierul {{{file.dat}}} care să conțină 10MB de date aleatoare, folosiți comanda 
 +<​code>​ 
 +dd if=/​dev/​urandom of=file.dat bs=1M count=10 
 +</​code>​
  
-==== TODO 2 ====+Comprimare fișierul {{{file.dat}}} pe rând în format {{{gzip}}}, {{{bzip2}}} și {{{zip}}}. Care sunt diferențele de mărime ale arhivelor?
  
-TODO+<note tip> 
 +După fiecare comprimare fișierul inițial se șterge în cazul comenzilor ''​gzip''​ și ''​bzip2''​ așa că va trebui să-l regenerați. 
 +</​note>​
  
 +Aflați cât durează fiecare comandă de comprimare folosind comanda ''​time''​ înaintea oricărei alte comenzi.
basic-unix/capitole/capitol-03.1463991093.txt.gz · Last modified: 2016/05/23 11:11 by razvan