La redirezione su Linux
La redirezione è una funzione del sistema operativo Linux che consente di inviare l'output di un comando come input del comando successivo tramite una pipe ( standard output ). Allo stesso modo si può usare come input un altro comando o un file ( standard input ).
Per redirigere l'output del comando si utilizza il simbolo maggiore > o >>. Per reindirizzare l'input si utilizza il simbolo minore < .
La redirezione può essere attuata sullo standard output, lo standard input e lo standard error. Può anche essere concatenata in azioni di input/output (I/O).
Nota. Il sistema operativo Linux associa un file a ogni dispositivo di input o di output. In questo modo è più facile gestire i flussi di input/output verso un dispositivo ed eventualmente reindirizzarlo verso altri.
Lo standard output
Nel sistema operativo Linux lo standard output di default è lo schermo.
E' indicato con l'abbreviazione stdout o con il descrittore di file numero 1.
Tuttavia, è possibile reindirizzare l'output anche verso altri dispositivi. Ad esempio, scriverlo in un file.
Per reindirizzare l'output si utilizza il simbolo > o >>.
Nota. 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 ).
Un esempio pratico
Quando digito il comando ls l'output viene visualizzato sullo schermo.
Per redirigere l'output di LS su un file, basta aggiungere il simbolo > seguito dal nome del file.
ls -l > prova.txt
In questo modo, Linux salva le informazioni di LS su un file.
Nota. Se il file non esiste nella directory corrente, viene creato. Se invece già esiste, il suo contenuto viene sovrascritto.
Per aggiungere le informazioni in coda al file senza cancellare il contenuto precedente, basta sostituire il simbolo maggiore (>) con il doppio maggiore (>>).
ls -l >> prova.txt
Per fare una verifica posso visualizzare il contenuto del file appena creato con il comando CAT oppure con un editor di testo ( es. Nano ).
Lo standard input
Lo standard input di default su Linux è la tastiera.
E' indicato con l'abbreviazione stdin o con il descrittore di file numero zero (0).
Per reindirizzare l'input si utilizza il simbolo minore ( < ).
Nota. 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 ).
Un esempio pratico
Per usare il contenuto di un file come input di un comando, scrivo il nome del file dopo il simbolo minore
sort < prova.txt
In questo modo imposto il file prova.txt come input del primo comando ( SORT ).
Il comando SORT ordina il contenuto del file prova.txt e lo visualizza sullo schermo.
Il comando non modifica il contenuto del file, non ordina i record al suo interno, perché modifica soltanto la visualizzazione sullo schermo.
Lo standard error
Lo standard error di default su Linux è lo schermo.
E' indicato con l'aggregazione stderr e con il descrittore di file numero due.
Per modificare la direzione dei messaggi di errore posso indicare la nuova destinazione dopo il simbolo 2>
Esempio
Per salvare il messaggio di errore del comando digito
ls qualcosa 2> errori.txt
Il comando salva il messaggio di errore sul file errori.txt anziché visualizzarlo sullo schermo.
Nota. Il simbolo 2> reindirizza il messaggio di errore ( descrittore 2 ). Se avessi usato il simbolo > avrebbe reindirizzato l'output del comando. Per salvare sia l'output che gli errori si può usare l'operatore di redirezione 2>&1. In questo modo, comunico a Linux 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.
Esempio 2
Può capitare di non voler né vedere i messaggi di errore sullo schermo, né salvarli in un file.
Per ottenere questo risultato reindirizzo gli errori verso il dispositivo /dev/null
ls qualcosa 2> /dev/null
In questo modo posso ignorare gli errori senza salvarli.
A cosa serve il file /dev/null? Il file /dev/null è una destinazione speciale. E' un file senza contenuti. Anche reindirizzandogli l'output o gli errori, il sistema operativo non può salvarli al suo interno.
Come concatenare le redirezioni input / output
Le redirezioni possono essere concatenate in un unico comando di input/output digitato sulla linea dei comandi.
Esempio
Il seguente comando ordina il contenuto del file prova.txt ma, anziché visualizzarlo sullo schermo, lo salva nel file prova2.txt
sort < prova.txt > prova2.txt
Nel precedente comando concatenato ho usato sia una redirezione di input (<) che una redirezione di output (>).
Altri esempi pratici
Nel seguente esempio la pipe è composta dalla concatenazione di due comandi.
tar cf - prova* | gzip > prova.tgz
Il primo comando della pipe, a sinistra del simbolo |, è il comando TAR.
Crea un file archivio con tutti i file prova* della
Nota. Nel comando tar non è indicato il nome del file perché è un file intermedio. Al suo posto c'è il simbolo meno ( - ).
Il secondo comando è GZIP.
Il comando GZIP prende in input l'output del comando precedente tramite il simbolo maggiore ( > ).