Linux es un interesante sistema operativo que alberga algunos dispositivos virtuales para numerosos propósitos. En lo que respecta a los programas que se ejecutan en el sistema, estos dispositivos virtuales actúan como si fueran archivos reales. Las herramientas pueden solicitar y alimentar datos de estas fuentes. Los datos son generados por el SO en lugar de leerlos de un disco.

Un ejemplo de ello es /dev/null. Es un archivo especial que está presente en todos los sistemas Linux. Sin embargo, a diferencia de la mayoría de los otros archivos virtuales, en lugar de leer, se utiliza para escribir. Cualquier cosa que escribas en /dev/null será descartada, olvidada en el vacío. Es conocido como el dispositivo nulo en un sistema UNIX.

¿Por qué querrías descartar algo al vacío? Vamos a ver lo que es /dev/null y su uso.

Requisitos previos

Antes de profundizar en el uso de /dev/null, tenemos que tener una comprensión clara del flujo de datos stdout y stderr. Revisa esta guía en profundidad sobre stdin, stderr, y stdout.

Tengamos una rápida actualización. Cada vez que se ejecuta cualquier utilidad de línea de comandos, genera dos salidas. La salida va a stdout y el error (si se genera) va a stderr. Por defecto, estos dos flujos de datos están asociados a la terminal.

Por ejemplo, el siguiente comando imprimirá la cadena que se encuentra dentro de las comillas dobles. Aquí, la salida se almacena en stdout.

$ echo «Hello World»

El siguiente comando nos mostrará el estado de salida del comando ejecutado anteriormente.

$ echo $?

Como el comando anterior se ejecutó con éxito, el estado de salida es 0. En caso contrario, el estado de salida será diferente. ¿Qué ocurre cuando se intenta ejecutar un comando no válido?

$ adfadsf
$ echo $?

Ahora, necesitamos saber sobre el descriptor de archivo. En el ecosistema UNIX, estos son valores enteros asignados a un archivo. Tanto stdout (descriptor de archivo = 1) como stderr (descriptor de archivo = 2) tienen un descriptor de archivo específico. Usando el descriptor de archivo (1 y 2 en esta situación), podemos redirigir el stdout y el stderr a otros archivos.

Para empezar, el siguiente ejemplo redirigirá el stdout del comando echo a un archivo de texto. Aquí, no especificamos el descriptor de archivo. Si no se especifica, bash utilizará stdout por defecto.

$ echo «Hello World» > log.txt

El siguiente comando redirigirá el stderr a un archivo de texto.

$ asdfadsa 2> error.txt

Usando /dev/null

Redirigiendo la salida a /dev/null

Ahora, estamos listos para aprender a usar /dev/null. En primer lugar, vamos a ver cómo filtrar la salida normal y el error. En el siguiente comando, grep tratará de buscar una cadena (hola, en este caso) en el directorio «/sys».

$ grep -r hola /sys/

Sin embargo, generará un montón de errores ya que sin el privilegio de root, grep no puede acceder a una serie de archivos. En tal caso, dará lugar a errores de «Permiso denegado». Ahora, usando la redirección, podemos obtener una salida más clara.

$ grep -r hello /sys/ 2> /dev/null

La salida se ve mucho mejor, ¿verdad? Nada. En este caso, grep no tiene acceso a muchos archivos y los que son accesibles no tienen la cadena «hola».

En el siguiente ejemplo, haremos ping a Google.

$ ping google.com

Sin embargo, no queremos ver todos esos resultados de ping exitosos. En su lugar, sólo queremos centrarnos en los errores cuando el ping no pudo llegar a Google. ¿Cómo lo hacemos?

$ ping google.com 1> /dev/null

Aquí, el contenido de stdout se vuelca a /dev/null, dejando sólo los errores.

Redirige toda la salida a /dev/null

En ciertas situaciones, la salida puede no ser útil en absoluto. Usando la redirección, podemos volcar toda la salida al vacío.

$ grep -r hello /sys/ > /dev/null 2>&1

Vamos a romper un poco este comando. Primero, vamos a volcar todo el stdout a /dev/null. Luego, en la segunda parte, le estamos diciendo a bash que envíe stderr a stdout. En este ejemplo, no hay nada que enviar. Sin embargo, si estás confundido, siempre puedes comprobar si el comando se ejecutó con éxito.

$ echo $?

El valor es 2 porque el comando generó muchos errores.

Si tiendes a olvidar el descriptor de archivo de stdout y stderr, el siguiente comando te servirá. Es un formato más generalizado del comando anterior. Tanto stdout como stderr serán redirigidos a /dev/null.

$ grep -r hello /sys/ &> /dev/null

Otros ejemplos

Este es interesante. ¿Recuerdas la herramienta dd? Es una poderosa herramienta para convertir y copiar archivos. Aprende más sobre dd. Usando dd, podemos probar la velocidad de lectura secuencial de tu disco. Por supuesto, no es una medida exacta. Sin embargo, para una prueba rápida, es bastante útil.

$ dd if=<fichero_grande> of=/dev/null status=progress bs=1M iflag=direct

Aquí, he utilizado la ISO de Ubuntu 18.04.4 como fichero grande.

De la misma manera, también puedes probar la velocidad de descarga de tu conexión a internet.

$ wget -O /dev/null <big_file_link>

Pensamientos finales

Es de esperar que tengas claro qué es ese archivo /dev/null. Es un dispositivo especial que, si se escribe en él, descarta y si se lee de él, lee null. El verdadero potencial de esta interesante característica está en los interesantes scripts de bash.

¿Estás interesado en los scripts de bash? Echa un vistazo a la guía para principiantes de scripts en bash.

¡Disfruta!

Deja una respuesta

Tu dirección de correo electrónico no será publicada.