Dividamos la >> /dev/null 2>&1
declaración en partes:
Parte 1: >>
redirección de salida
Esto se utiliza para redirigir la salida del programa y agregar la salida al final del archivo. Más...
Parte 2: /dev/null
archivo especial
Este es un archivo especial de pseudodispositivos .
El comando ls -l /dev/null
te dará detalles de este archivo:
crw-rw-rw-. 1 root root 1, 3 Mar 20 18:37 /dev/null
¿Lo observaste crw
? Lo que significa que es un archivo de pseudodispositivo que es de tipo de archivo de caracteres especiales que proporciona acceso en serie.
/dev/null
acepta y descarta todas las entradas; no produce salida (siempre devuelve una indicación de fin de archivo en una lectura). Referencia: Wikipedia
Parte 3: 2>&1
descriptor de archivo
Cada vez que ejecuta un programa, el sistema operativo siempre abre tres archivos, entrada estándar, salida estándar y error estándar, ya que sabemos que cada vez que se abre un archivo, el sistema operativo (desde el núcleo ) devuelve un entero no negativo llamado descriptor de archivo . El descriptor de archivo para estos archivos es 0, 1 y 2, respectivamente.
Entonces 2>&1
simplemente dice redirigir el error estándar a la salida estándar.
&
significa que lo que sigue es un descriptor de archivo, no un nombre de archivo.
En resumen, al usar este comando le está diciendo a su programa que no grite mientras se ejecuta.
¿Cuál es la importancia de usar 2>&1
?
Si no desea producir ninguna salida, incluso en caso de algún error producido en el terminal. Para explicar más claramente, consideremos el siguiente ejemplo:
$ ls -l > /dev/null
Para el comando anterior, no se imprimió ninguna salida en el terminal, pero qué pasa si este comando produce un error:
$ ls -l file_doesnot_exists > /dev/null
ls: cannot access file_doesnot_exists: No such file or directory
A pesar de que estoy redirigiendo la salida /dev/null
, se imprime en el terminal. Es porque no estamos redirigiendo la salida de error /dev/null
, por lo que para redirigir también la salida de error, es necesario agregar 2>&1
:
$ ls -l file_doesnot_exists > /dev/null 2>&1
>&- 2>&-
.