Introduzione

Quando si reindirizza l'output di un comando su un file o lo si reindirizza a un altro comando, è possibile notare che i messaggi di errore vengono stampati sullo schermo.

In Bash e altre shell Linux, quando un programma viene eseguito, utilizza tre flussi I/O standard. Ogni flusso è rappresentato da un descrittore di file numerico:

  • 0 - stdin, il flusso di input standard.
  • 1 - stdout, il flusso di output standard.
  • 2 - stderr, il flusso di errori standard.

Un descrittore di file è solo un numero che rappresenta un file aperto.

Il flusso di input fornisce informazioni al programma, generalmente digitando la tastiera.

L'output del programma passa al flusso di input standard e i messaggi di errore vanno al flusso di errore standard. Per impostazione predefinita, sia i flussi di input che quelli di errore sono stampati sullo schermo.

Reindirizzamento dell'output

Il reindirizzamento è un modo per acquisire l'output da un programma e inviarlo come input a un altro programma o file.

Gli stream possono essere reindirizzati utilizzando l'operatore n>, dove n è il numero del file descrittore.

Quando n viene omesso, per impostazione predefinita è 1 il flusso di output standard. Ad esempio, i seguenti due comandi sono uguali; entrambi reindirizzeranno il comando output (stdout) sul file.

command > file
command 1> file

Per reindirizzare l'errore standard (stderr) utilizzare l'operatore 2>:

command 2> file

È possibile scrivere sia stderr e stdout in due file separati:

command 2> error.txt 1> output.txt

Per eliminare la visualizzazione dei messaggi di errore sullo schermo, reindirizzare stderr a /dev/null:

command 2> /dev/null

Reindirizzamento stderr a stdout

Quando si salva l'output del programma in un file, è abbastanza comune reindirizzare stderr in stdout in modo da poter avere tutto in un singolo file.

Per reindirizzare stderr a stdout ed avere i messaggi di errore inviati allo stesso file come standard output, utilizzare il seguente:

command > file 2>&1

> file reindirizza stdout a file e 2>&1 reindirizza stderr alla posizione corrente di stdout.

L'ordine di reindirizzamento è importante. Ad esempio, il seguente esempio reindirizza solo stdout a file. Ciò accade perché stderr viene reindirizzato a stdout prima del reindirizzamento di stdout a file.

command 2>&1 > file 

Un altro modo per reindirizzare stderr a stdout è di usare il costrutto &>. In Bash &> ha lo stesso significato di 2>&1:

command &> file

Conclusione

Comprendere il concetto di reindirizzamenti e descrittori di file è molto importante quando si lavora sulla riga di comando.

Per reindirizzare stderr e stdout, utilizzare i costrutti 2>&1 o &>.