• linux-redirect-stdin-stdout-stderr

    Input e output redirect in Linux

    Come effettuare il redirect dei flussi stdin, stdout e stderror in Linux: strumenti, descrittori di file, sintassi ed esempi.

    I tre flussi input e output: stdin, stdout e stderr

    I sistemi operativi UNIX based forniscono tre diversi canali input e output:

    1. stdin
    2. stdout
    3. stderr

    Essi rendono possibile la comunicazione tra un programma e l’ambiente in cui esso viene eseguito. Nella shell Bash questi canali vengono numerati rispettivamente con 0 (stdin), 1 (stdout) e 2 (stderr), e vengono chiamati descrittori di file. È possibile manipolarli, copiarli, leggerli o scrivere su di essi, esattamente come per qualunque altro file memorizzato nel sistema.

    Quando parte un ambiente Bash, tutti e tre i file descriptor di default puntano al terminale nel quale è stata inizializzata la sessione:

    1. l’input (stdin – 0) corrisponde a ciò che viene digitato nel terminale;
    2. l’output standard (stdout – 1) per i messaggi tradizionali viene inviato al terminale
    3. l’output di errore (stderr – 2) per i messaggi di errore viene inviato al terminale.

    Un terminale aperto in un sistema operativo UNIX based, è in genere esso stesso un file, comunemente memorizzato in /dev/ttyn. Perciò, inizialmente i tre file descriptor puntano tutti al file che rappresenta il terminale in cui vengono eseguiti.

    Il redirect (redirezione) Input/Output dei comandi Linux consente di convogliare l’output di un comando in un file, oppure il contenuto di un file in un comando, oppure ancora l’output di un comando verso un altro comando, consentendo un notevole risparmio di tempo.

     

    Redirect dello stdout

    Nel sistema operativo Linux lo standard output di default è il terminale, che viene mostrato sullo schermo. Viene indicato con l’abbreviazione stdout o con il descrittore di file numero 1.

    È possibile reindirizzare l’output verso altri dispositivi, ad esempio, in un file. Per reindirizzare l’output si utilizza il simbolo > oppure >>.

    Il simbolo > equivale alla forma estesa 1>. Nella forma estesa l’operatore di redirezione indica esplicitamente il numero del descrittore di file da usare ( 1=standard output ).

    linux-redirect-stdout

    Ad esempio, piuttosto che mostrare sullo schermo l’output del comando ls -la, lo reindirizzo sul file elenco.txt:

    ls -l > elenco.txt

    Bash prova come prima cosa ad aprire il file con i permessi di scrittura. In caso di successo, invia lo stream stdout al file appena aperto, sovrascrivendone l’eventuale contenuto esistente. Se il file non esiste, lo crea. Lo stesso risultato si ottiene con il comando seguente:

    ls -l  1> elenco.txt

    Questo perché stdout è il descrittore file 1.

    Per aggiungere le informazioni in coda al file senza sovrascrivere il contenuto precedente, basta sostituire il simbolo maggiore (>) con il doppio maggiore (>>). Ad esempio:

    ls -l >> elenco.txt

     

    Redirect dello stdin

    Lo standard input di default su Linux è la tastiera. Viene indicato con l’abbreviazione stdin o con il descrittore di file numero zero (0).

    Per reindirizzare l’input si utilizza il simbolo minore ( < ). . Il simbolo < equivale alla forma estesa 0<. Nella forma estesa l’operatore di redirezione specifica il numero del descrittore di file da prendere in considerazione ( 0=standard input ).

    linux-redirect-stdin

    Ad esempio. Creiamo il file tecnologie.txt che contiene il seguente testo:

    Java
    Oracle
    Spring
    Angular JS
    Maven
    Git

    Lanciando il comando seguente, viene impostato il file tecnologie.txt come input per il comando sort:

    sort < tecnologie.txt

    Che mostra il seguente output a schermo:

    Angular JS
    Git
    Java
    Maven
    Oracle
    Spring

    Il comando non altera il contenuto del file, ma interviene solo a livello di visualizzazione sullo schermo.

    Redirect dello stderr

    Lo standard error di default su Linux è lo schermo. Viene indicato con l’abbreviazione stderr e con il descrittore di file numero due (2).

    È possibile reindirizzare i messaggi d’errore verso altri dispositivi, ad esempio in un file, indicando la nuova destinazione dopo il simbolo 2>

    Ad esempio, abbiamo visto in fondo all’articolo “Ricerca di file e testo in Linux: i comandi find, locate e grep” che il comando seguente genera, oltre ai risultati desiderati, anche un errore (mancato accesso a una determinata directory a causa della mancanza delle autorizzazioni necessarie): no such file or directory

    linux-comando-grep-errore

    Per evitare che tale messaggio di errore venga visualizzato a video, è possibile reindirizzarlo al dispositivo /dev/null. Il file /dev/null è una destinazione speciale: si tratta di un file senza contenuti. Anche reindirizzandogli l’output o gli errori, il sistema operativo non può salvarli al suo interno. Si utilizza quando non si vuole né vedere i messaggi di errore sullo schermo, né salvarli in un file.

    linux-comando-grep-errore-redirect-stderr

     

    Per salvare sia l’output che gli errori si può usare l’operatore di redirezione 2>&1. In questo modo, si comunica al sistema operativo di reindirizzare i messaggi di errore verso il descrittore 1. Per indicare il descrittore è necessario anteporre il simbolo della e commerciale (&). In caso contrario, senza indicare il simbolo &, Linux salverebbe gli errori in un file chiamandolo 1.

     

    Concatenazione del redirect dello stdin e dello stdout

    È possibile concatenare i redirect in un unico comando di input/output digitato sulla linea dei comandi. Ad esempio, il seguente comando ordina il contenuto del file tecnologie.txt ma, anziché visualizzarlo sullo schermo, lo salva nel file tech.txt:

    sort < tecnologie.txt > tech.txt

    Il contenuto del file tech.txt sarà:

    Angular JS
    Git
    Java
    Maven
    Oracle
    Spring

    In questo comando ho usato sia un input redirect (<) che un output redirect (>).

    Un altro esempio è dato dalla concatenazione di comandi tramite pipe (|). Con il seguente comando concateno due comandoi:

    tar cf – var* | gzip > var.tgz

    Il primo comando (a sinistra del simbolo |) è il comando tar, mentre il secondo (a destra del simbolo |) è gzip.

     

    Giulio Cantali – IT Consultant

    Creatore di Database Master, il primo percorso per diventare esperti di database

     

Lascia un commento

Se vuoi condividere la tua opinione, lascia un commento

Puoi usare questi tag e attributi: HTML:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">