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 &>
.