In generale in Linux esistono tre flussi standard di Input Output che consentono di far dialogare l’utente con il terminale. Questi sono: lo stream di ingresso (stdin), che porta alle applicazioni e al sistema operativo i dati immessi dall’utente tramite una periferica di input (tastiera), lo stream di uscita (stdout), che stampa a schermo i messaggi delle applicazioni, ed infine lo stream degli errori (stderr), che stampa gli errori a schermo.

Ad ogni flusso è associato un valore numerico, detto file descriptor, ed è proprio questo che viene utilizzato negli script bash per consentirne la redirezione. Con quest’ultimo termine intendiamo lo spostamento di una serie di dati che transitano in un flusso, verso un altro flusso. Ad esempio è possibile spostare i messaggi di errore che le applicazioni stampano in stderr sullo stream di uscita e viceversa.

Vediamo più da vicino come si fa.

La seguente tabella mostra la relazione tra i flussi e i loro descrittori:

stream file number
stdin 0
stdout 1
stderr 2

In generale possiamo redirigere il flusso x sul flusso y utilizzando la sintassi

x>&y

Quindi, se vogliamo spostare tutti i messaggi di errore sul normale flusso d’uscita la sintassi sarà

2>&1

Il flusso stdout è considerato quello di default e, quando si trova a sinistra della redirezione può essere omesso. Ad esempio:

>&2

Se vogliamo redirigere un output su file possiamo usare la stessa sintassi appena descritta, a meno del carattere &. Così, ad esempio, se vogliamo salvare su file ciò che un programma stampa a schermo possiamo usare la seguente sintassi:

x>/path/del/file

dove x può essere 1 oppure 2.

Per concludere facciamo qualche esempio completo di utilizzo.
ls >&2   Sposta l’output del comando ls sullo stream degli errori
ls >&2 2>/dev/null   Sposta l’uscita di ls sul flusso degli errori e poi redirige quest’ultimo su /dev/null (non stampa niente a schermo)
ls 2>/dev/null   Impedisce la visualizzazione degli errori dirottandoli su /dev/null
ls >&0 | echo   Passa l’output di ls ad echo che provvede a stamparlo a schermo (la sola pipe tra processi non funziona in questo caso, provatelo! ls | echo)

Per una descrizione più approfondita rimando alla seguente pagina: http://www.tldp.org/LDP/abs/html/io-redirection.html