3. stderr (Standard Error)

Acum haideți să încercăm ceva puțin mai diferit, hai să încercăm să listăm conținutul unui director care nu există în sistemul dvs. de operare și, apoi să redirecționăm fluxul de ieșire (output-ul) către celebrul nostru fișier flux_iesire.txt.

$ ls /director/fals > flux_iesire.txt 

Ceea ce ar trebui să vedeți ar fi:

ls: cannot access /director/fals: No such file or directory

În acest moment, proabil vă gândiți, că nu ar fi trebuit ca acel mesaj să fie trimis către fișierul desemnat? În acest punct intră în scenă un alt flux I/O (intrare/ieșire) denumit sugestiv eroare standard (stderr). Implicit, fluxul stderr își trimite mesajele tot către ecran, dar este complet diferit dacă îl comparăm cu stdout. Pentru a funcționa comanda de mai sus va trebui să redirecționați acest flux într-o manieră diferită.

Din păcate simbolul pentru redirecționare nu mai este atât de intuitiv și ușor precum < sau >, dar este destul de apropiat. Va trebui să folosim descriptori de fișier. Un descriptor de fișier este un număr non-negativ care este folosit pentru a accesa un flux sau un fișier. Vom intra în amănunte legat de acest subiect în alte lecții pe parcursul acestui curs. Dar pentru moment trebuie să știți că descriptoarele de fișiere pentru stdin, stdout, stderr sunt respectiv 0,1 și 2.

Așa că dacă vrem să redirectăm stderr către un fișier, va trebui să procedăm astfel.

$ ls /director/fals 2> flux_iesire.txt

Ar trbui să vedeți acum mesajele de eroar generate de fluxul stderr în fișierul flux_iesire.txt.

Dar dacă ați dori să vădeți atât fluxul stdin cât și pe cel stdout în același fișier flux_iesire.txt? Este posibil să faceți acest lucru cu ajutorul descriptorilor de fișire:

$ ls /director/fals > flux_iesire.txt 2>&1

Acesta trimite rezultatele comenzii ls /director/fals către fișierul flux_iesire.txt și apoi redirecționează fluxul stderr către stdout cu ajutorul comenzii 2>&1. Ordinea operațiilor aici contează, 2>&1 trimite stderr către un oarecare stdout care operează în acel moment. În cazul de față stdout este direcționat către un fișier, așa că 2>&1 trimite implicit stderr către acel fișier. Așa că dacă deschideți fișierul flux_iesire.txt ar trebui să vedeți atât stderr cât și stdout. În cazul nostru, comanda de mai sus trimite doar mesajele stderr, dat fiind faptul că nu poate afișa nimic cu stdout, comanda fiind greșită.

Există și o variantă prescurtată pentru redirecționarea simultană a stdout și a stderr către un fișier:

$ ls /director/fals &> flux_iesire.txt

Dar totuși dacă nu doriți aceste mesaje enervante și vreți să scăpați complet de stderr? Ei bine, puteți opta pentru redirecționarea mesajelor către un fișier special denumit /dev/null, iar acesta va șterge (distruge) orice flux de input.

$ ls /director/fals 2> /dev/null

Exerciții

Ce credeți că face următoarea comandă:

$ ls /director/fals >> /dev/null 2>&1

Lasă un răspuns

Adresa ta de email nu va fi publicată.

Acest site folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.