User Tools

Site Tools


linux-admin:capitole:capitol-07

This is an old revision of the document!


7. Redirectări

Redirectarile sunt principalul mijloc prin care stocam pe disc, in fisiere, precularile de date facute de scripturi.

Subiecte abordate

  • STDOUT (1)
  • STDERR (2)
  • STDIN (0)

Resurse utile

Exerciții

Demo-uri

Redirectare stdout (standard output, în general mesaje afișate prin comenzi similare cu printf din C). De exemplu, într-un sistem în care avem multe procese, e greu sa urmărim direct în consolă output-ul comenzii ps:

training@box:~$ ps -f -u student > stdout.txt 
training@box:~$ cat stdout.txt

Putem redirecta doar mesajele de eroare către un fișier. Scenariu: Vrem să găsim toate fișierele cu extensia *.conf din directorul /etc.

training@box:~$ find /etc -name '*.conf'
(...)
find: `/etc/ppp/peers': Permission denied
(...)

Ne deranjează mesajele de eroare din cauza lipsei drepturilor de citire asupra unor fișiere sau directoare. Pentru aceasta vom folosi:

training@box:~$ find /etc -name '*.conf' 2> errors.txt
training@box:~$ cat errors.txt

Putem face combinații acum: redirectăm erorile într-un fișier și rezultatele în alt fișier:

training@box:~$ find /etc -name '*.conf' 2> errors.txt > stdout.txt

În cazul în care dorim să redirecționăm toate mesajele afișate de o comandă, la grămadă, folosim operatorul &>:

training@box:~$ find /etc -name '*.conf' &> find_output.txt

Reamintiți-vă de la procese procfs, montat în /proc. Pentru fiecare proces identificat printr-un PID, aveam directorul /proc/19827/fd, care conținea link-uri simbolice către fișierele deschise de acel proces. Pentru fiecare proces în acel director găseam 0, 1, 2. Acestea reprezintă respectiv:

  • 0 - intrarea standard (stdin). Exemplu: tastatura
  • 1 - ieșirea standard (stdout). Exemplu: mesaje afișate cu printf de un program C
  • 2 - ieșirea standard de eroare (stderr), unde se duc mesaje precum cele afișate de find mai sus.

Putem redirecta outputul și către device-uri virtuale, cum ar fi /dev/null. În general facem acest lucru deoarece vrem să executăm o anumită comandă (într-un program sau într-un script), fără a ne interesa outputul ei. Pentru exemplul cu find de mai sus, să zicem că dorim să ignorăm erorile:

training@box:~$ find /etc -name '*.conf' 2> /dev/null 

Atenție! Toți operatorii de redirectare din acest demo 2>, &>, > trunchiază conținutul fișierului, dacă acesta exista. Ca alternativă aveam append mode, care se poate aplica și aici, fără probleme, astfel: 2>>, &>>, >>.

Exercițiu 1

De multe ori dorim să căutăm într-o ierarhie de fișiere și directoare, dar după anumite criterii. Comanda cea mai potrivită în acest caz este find. Folosiți find pentru a afișa toate fișierele din ierarhia /etc/ (adică toate fișierele din /etc/, din subdirectoarele acestuia, din subdirectoarele subdirectoarelor etc.). Hint: Folosiți opțiunea -type a comenzii find.

Extindeți comanda anterioară pentru a afișa toate fișierele din ierarhia /etc/ al căror nume începe cu litere între a și d. Hint: Folosiți opțiunea -name a comenzii find și construcția [a-d]* pentru a indica un șir care începe cu o literă între a și d urmată de orice altceva.

Extindeți comanda anterioară pentru a afișa toate fișierele din ierahia /etc/ care au permisiunile de forma rw-------, adică 600. Hint: Folosiți opțiunea -perm urmată de permisiunile căutate în format octal.

Pentru comanda finală, redirectați outputul în fișierul ~/file_list.txt și erorile în ~/errors.txt.

Exercițiu 2

linux-admin/capitole/capitol-07.1475131652.txt.gz · Last modified: 2016/09/29 09:47 by mihaic