Quando si reindirizza l'output di un comando a un file o lo si reindirizza a un altro comando, è possibile notare che i messaggi di errore vengono stampati sullo schermo.
In Bash e in altre shell Linux, quando un programma viene eseguito, utilizza tre flussi di I/O standard. Ciascun 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 errore standard.
Un descrittore di file è solo un numero che rappresenta un file aperto.
Il flusso di input fornisce informazioni al programma, generalmente digitando sulla tastiera.
L'output del programma va al flusso di input standard e i messaggi di errore vanno al flusso di errore standard. Per impostazione predefinita, sullo schermo vengono stampati sia i flussi di input che quelli di errore.
Reindirizzamento 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 il n>
operatore, dove n
è il numero del descrittore del file.
Quando n
viene omesso, il valore predefinito è 1
, il flusso di output standard. Ad esempio, i due comandi seguenti sono gli stessi; entrambi reindirizzeranno l'output del comando (stdout
) al file.
command > file
command 1> file
Per reindirizzare l'errore standard (stderr
) utilizzare il 2>
operatore:
command 2> file
Puoi scrivere entrambi stderr
e stdout
in due file separati:
command 2> error.txt 1> output.txt
Per evitare che i messaggi di errore vengano visualizzati sullo schermo, reindirizza stderr
a /dev/null
:
command 2> /dev/null
Reindirizzamento di stderr
a stdout
#
Quando si salva l'output del programma in un file, è abbastanza comune reindirizzare stderr
a stdout
in modo da poter avere tutto in un unico file.
Per reindirizzare stderr
a stdout
e avere messaggi di errore inviati allo stesso file dell'output standard, utilizzare quanto segue:
command > file 2>&1
> file
reindirizzare lo stdout
in file
e 2>&1
reindirizzare lo stderr
alla posizione corrente di stdout
.
L'ordine di reindirizzamento è importante. Ad esempio, l'esempio seguente reindirizza solo stdout
in file
. Questo accade perché stderr
viene reindirizzato a stdout
prima dello stdout
è stato reindirizzato a file
.
command 2>&1 > file
Un altro modo per reindirizzare stderr
a stdout
consiste nell'usare il &>
costruire. 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
, usa 2>&1
o &>
costrutti.
Se hai domande o feedback, sentiti libero di lasciare un commento.