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
.