Guardiamo un altro esempio. Dati i seguenti due comandi: il primo (ls
) è un comando valido mentre il secondo (ls -0
) è un comando non valido perché contiene un’opzione illegale -0
.
Questo è un comando valido:
$ ls
Applications Documents Library Music Public$ echo $?
0
Ora guardiamo il comando non valido:
$ ls -0
ls: illegal option -- 0
usage: ls $ echo $?
1
Il problema del secondo script è che visualizza qualsiasi messaggio di errore in STDERR
. Tuttavia per i nostri script, vogliamo sopprimere i messaggi di errore. Fortunatamente c’è un trucco per fare esattamente ciò che vogliamo.
Proviamolo di nuovo con > /dev/null 2>&1
:
$ ls -0 > /dev/null 2>&1
$ echo $?
1
Nota che questa volta non abbiamo visto alcun messaggio di errore. Per scomporre il tutto, stiamo sopprimendo l’output di errore (stderr
) del comando ls -0
, reindirizzandolo allo standard output (stdout
), scrivendolo su /dev/null
e scartandolo immediatamente. Il simbolo >&
è un operatore che copia l’output del primo descrittore di file (2) e lo reindirizza all’output del secondo descrittore di file (1).
Ora vediamo cosa rappresentano i numeri in 2>&1
guardando questa tabella dei descrittori di file.
Possiamo verificarlo facendo l’output su un file normale invece che su /dev/null
.
$ ls -0 > /tmp/devnull 2>&1
$ echo $?
1$ cat /tmp/devnull
ls: illegal option -- 0
usage: ls