Redirezione nel terminale – Parte 3: descriptor, standard error e conclusioni

By Jessica Lambiase

ls

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.

ls3

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.

ls4

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

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;
    sort1
  • 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.
    ls1ls

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.

ls3

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.

ls4

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.
Amazon Music
Scopri le ultime offerte per dischi ssd su Acquista su Amazon
Scopri le ultime offerte per memorie RAM DDR su Acquista su Amazon
Scopri le ultime offerte per Chromebook su Acquista su Amazon
Scopri le ultime offerte per Raspberry su Acquista su Amazon

Potrebbero interessarti anche...

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.