Reindirizzare messaggi di errore (STDERR) verso lo Standard Output (STDOUTPUT)

· 1 min lettura
Reindirizzare messaggi di errore (STDERR) verso lo Standard Output (STDOUTPUT)

Se reindirizzate un comando come rm o tar verso un file o /dev/null, avrete fatto caso sicuramente che certi messaggi non vengono reindirizzati, anzi, vengono mandati a schermo, in certi casi "sporcando" l'output.

Una situazione che mi è capitata in passato, è quella dove si devono fare degli script che eseguano delle operazioni senza far effettivamente "vedere" nulla (nella così detta "silent mode"), a meno che non sia esplicitamente richiesto.

È risultato scomodo avere i messaggi di errore o di sistema a schermo (che, per chi non lo sa, non fanno parte dello standard output, ma dello standard error, ossia un registro di memoria apposta per ospitare gli eventuali errori delle operazioni).

Un esempio dello stderr è il seguente:

$ rm > /dev/null
rm: operando mancante
Try 'rm --help' for more information.

Nonostante abbia esplicitamente reindirizzato l'output di rm dentro null, qualcosa è stato visualizzato comunque.

Un altro esempio è il comando tar, che produrrà il seguente output:

$ tar > /dev/null
tar: È necessario specificare una delle opzioni "-Acdtrux", "--delete" o "--test-label" Provare "tar --help" o "tar --usage" per ulteriori informazioni.

Come prima, nonostante abbia reindirizzato tutto l'output in /dev/null, qualcosa è uscito. Per risolvere questo problema, dopotutto estetico, si adopera il seguente operatore:

2>&1

Infatti, se adoperato, esso ometterà l'output di stderr durante l'esecuzione del comando.

Esempio:

$ tar 2>/dev/null
$

Un modo alternativo:

$ tar > /dev/null 2>&1
$

Cosa succede dietro questo comando?

L'output di tar (che utilizzerebbe lo standard output, ossia canale 1) va a reindirizzarsi in /dev/null.

Il canale 2 (lo standard error) viene reindirizzato dentro il canale di output, ossia dentro /dev/null.

Si forma una catena di reindirizzamenti che alla fine porta canale stdout e stderr dentro /dev/null.