Veamos otro ejemplo. Dados los siguientes dos comandos: el primero (ls
) es un comando válido mientras que el segundo (ls -0
) es un comando inválido porque contiene una opción ilegal -0
.
Este es un comando válido:
$ ls
Applications Documents Library Music Public$ echo $?
0
Ahora veamos el comando inválido:
$ ls -0
ls: illegal option -- 0
usage: ls $ echo $?
1
El problema con el segundo script es que muestra cualquier mensaje de error en STDERR
. Sin embargo, para nuestros scripts, queremos suprimir los mensajes de error. Por suerte hay un truco para hacer exactamente lo que queremos.
Volvamos a intentarlo con > /dev/null 2>&1
:
$ ls -0 > /dev/null 2>&1
$ echo $?
1
Nota esta vez, que no vemos ningún mensaje de error. Para desglosar esto, estamos suprimiendo la salida de error (stderr
) del comando ls -0
, redirigiéndola a la salida estándar (stdout
), escribiéndola en /dev/null
y descartándola inmediatamente. El símbolo >&
es un operador que copia la salida del primer descriptor de fichero (2) y la redirige a la salida del segundo descriptor de fichero (1).
Ahora veamos lo que representan los números de 2>&1
mirando esta tabla de Descriptores de Fichero.
Podemos comprobarlo dando salida a un fichero normal en lugar de /dev/null
.
$ ls -0 > /tmp/devnull 2>&1
$ echo $?
1$ cat /tmp/devnull
ls: illegal option -- 0
usage: ls