Redirezione nel terminale – Parte 3: descriptor, standard error e conclusioni
Siamo giunti all’ultima puntata della nostra piccola guida a quella che è la redirezione nel terminale: nella prima puntata abbiamo avuto modo di introdurre i concetti di input ed output e gli operatori principali (angolari e pipe), mentre nella parte successiva abbiamo analizzato i filtri più comuni applicandoli a diversi scenari.
In questa parte andremo ad introdurre il concetto di standard error, quello di file descriptor e, infine, andremo a creare qualche comando utile combinando quanto appreso fino ad esso.
Redirezione nel terminale: Parte 1 – Angolari e pipe
Redirezione nel terminale: Parte 2 – I filtri
Redirezione nel terminale: Parte 3 – File descriptor, standard error e conclusioni (vi trovate qui)
Redirezione nel terminale – Lo standard error
Fino ad ora abbiamo teso a generalizzare l’output di un comando come “ciò che il comando restituisce”, tuttavia prima di entrare nel discorso file descriptor è bene introdurre un altro tipo di eventuale restituzione da parte di un comando: gli errori. Si, perché se la maggior parte delle distribuzioni Linux mostra sia l’output che gli errori di esecuzione di un comando a terminale, il sistema operativo fa invece distinzione tra standard output e standard error.
Per standard error si intende quella parte in cui vengono dirottati i messaggi d’errore restituiti da un qualunque comando. Facciamo un esempio per comprenderne il funzionamento: dato un programma pincopallino in grado di ordinare alfabeticamente un qualsiasi file, è possibile far si che questo mostri a terminale i messaggi di output (le righe ordinate), mentre vada a salvare in un file di log i messaggi d’errore generati (ad esempio “File non trovato” o “Spazio su disco insufficiente per eseguire l’operazione”).
Questo tipo di distinzione è particolarmente usata dai programmatori sia per fini di debug che per comodità; tra qualche secondo, dopo aver introdotto il concetto di file descriptor, andremo a capire come.
Redirezione nel terminale – I file descriptor
Di norma, un programma per essere eseguito ha bisogno che venga aperto (in lettura, scrittura o entrambe le direzioni) almeno un file. Generalmente Linux identifica ciascun file aperto da qualsiasi programma con un numero intero: questo numero intero prende il nome di file descriptor.
Detto ciò, quando abbiamo parlato di filesystem abbiamo ricordato che Linux riconosce come file qualsiasi cosa, e con qualsiasi cosa andiamo ad includere anche le periferiche o i file da cui si prende input, le periferiche o i file su cui si rilascia output e le periferiche o i file su cui si rilasciano gli errori.
Ebbene, per impostazione predefinita all’atto dell’esecuzione di un programma Linux apre almeno 3 file, associati ad altrettanti file descriptor:
- lo standard input, con file descriptor 0, è di norma la periferica da cui il programma riceve input, quindi la tastiera;
- lo standard output, con file descriptor 1, è di norma il posto su cui il programma mostra l’output, quindi il terminale (identificato come /dev/ttyX o /dev/psX);
- lo standard error, con file descriptor 2, è di norma il posto su cui si mostrano gli errori generati dal programma, che potrebbe corrispondere al terminale stesso oppure, a discrezione del programmatore, ad un file di log.
Ora, quando si invoca un programma e lo si accompagna con un’operatore di redirezione, i file descriptor non vengono specificati in quanto sottintesi dal sistema operativo; in particolare (da notare che tra l’operatore di redirezione ed il file descriptor non c’è spazio)
- se il primo operatore di redirezione di un’espressione è <, questa si intende riferita allo standard input; scrivere sort -n < lista_numeri.txt è equivalente a scrivere sort -n 0< lista_numeri.txt;
- se il primo operatore di redirezione di un’espressione è >, questa si intende riferita allo standard output; scrivere ls > lista_file.txt è equivalente a scrivere ls 1> lista_file.txt.
Detto ciò, andiamo un po’ a giocare con questi file descriptor unendoli agli operatori di redirezione.
Redirezione nel terminale – esempi d’uso con file descriptor
Il comando
ls > lista_file 2>&1
andrà a redirigere sia lo standard output che lo standard error generati dal comando ls nel file lista_file (senza specificare la redirezione dello standard error, questo sarebbe stato mostrato a video senza essere salvato nel file). Notate come a destra dell’operatore > il file descriptor 1 sia preceduto dal simbolo “&”: in questo caso, la “&” dice al sistema operativo di interpretare il carattere successivo come un file descriptor e non come il nome di un file.
Come vi ho spiegato poc’anzi, Linux fa distinzione tra standard output e standard error. Ciò significa che se potrete visualizzare “a scorrimento” l’output di un comando usando il pipe un qualsiasi filtro (head, tail, more, less e via dicendo), ciò non succederà con gli errori – che saranno mostrati tutti in un colpo. A meno che non scriviate un comando del tipo
netstat 2>&1 | less
che a redirigere lo standard error (2) nello standard output, passando quest’ultimo al comando less. Ciò significa, in parole povere, che tutti gli errori saranno mostrati nello standard output e dati in pasto al comando less, che vi permetterà di vederli “a scorrimento”.
Con l’ultimo comando di questa lista andiamo a vedere la vera e propria differenza tra standard output e standard error: presi due terminali diversi, andremo ad invocare un comando sul primo mostrando gli eventuali errori su un secondo terminale.
Infine, l’ultimo comando “demo” che voglio suggerire riguarda il filtro tee: esso permette infatti, sempre grazie al pipe, di mostrare l’output sia su standard output che su un certo numero di file. Ad esempio, il comando
ps aux | tee processi1 processi2 processi3
mostrerà la lista dei processi in esecuzione a terminale (standard output) e salverà la stessa lista nei file processi1, processi2 e processi3.
Conclusioni
Gli operatori di redirezione sono un toccasana sia per l’utente home che per il professionista (sistemisti, programmatori e via dicendo) e permettono di ottenere risultati soddisfacenti minimizzando l’utilizzo di comandi accessori – evitando spesso sequenze lunghissime. Quelli mostrati nella nostra guida sono stati soltanto esempi, tuttavia è possibile combinare operatori, filtri e file descriptor in modo da creare programmi, script e alias che possano soddisfare le proprie esigenze.
Usare la redirezione non è un affare particolarmente compresso: con i cenni teorici ricevuti grazie alla nostra guida, un po’ di fantasia ed un minimo di pratica si possono ottenere risultati assolutamente soddisfacenti!
L’articolo Redirezione nel terminale – Parte 3: descriptor, standard error e conclusioni appare per la prima volta su Chimera Revo – News, guide e recensioni sul Mondo della tecnologia.
Se vuoi sostenerci, puoi farlo acquistando qualsiasi cosa dai diversi link di affiliazione che abbiamo nel nostro sito o partendo da qui oppure alcune di queste distribuzioni GNU/Linux che sono disponibili sul nostro negozio online, quelle mancanti possono essere comunque richieste, e su cui trovi anche PC, NAS e il ns ServerOne. Se ti senti generoso, puoi anche donarmi solo 1€ o più se vuoi con PayPal e aiutarmi a continuare a pubblicare più contenuti come questo. Grazie!
Hai dubbi o problemi? Ti aiutiamo noi!
Se vuoi rimanere sempre aggiornato, iscriviti al nostro canale Telegram.Se vuoi ricevere supporto per qualsiasi dubbio o problema, iscriviti alla nostra community Facebook o gruppo Telegram.
Cosa ne pensi? Fateci sapere i vostri pensieri nei commenti qui sotto.
Ti piace quello che leggi? Per favore condividilo con gli altri.