Si ya poseemos algunas nociones del árbol de directorios de GNU/Linux, debe sonarnos al menos la referencia /dev/, que es, efectivamente donde se encuentran todos los archivos relacionados con dispositivos de hardware.
Si miramos en el directorio /dev/ veremos un “archivo” llamado null, pero si queremos abrirlo para ver su contenido, el sistema nos dirá que no es posible ya que no es de contenido ordinario. He entrecomillado la palabra archivo porque, como todos sabéis para Linux todo (hardware y software) se representa como un archivo. |
¿A qué dispositivo se corresponde /dev/null?
A efectos prácticos imagínate un cubo de basura, un pozo sin fondo o el espacio sideral al que lanzar cualquier cosa sin posibilidad de recuperarla (por mucho que se empeñen los tipos de la Nasa).
Pero si ya tengo comandos como rm, ¿para qué quiero otra cosa nueva que borre?
Porque la forma de trabajar de ambos “agujeros negros” es completamente diferente: ¿cómo harías para anular en tiempo de ejecución la salida estándar de un error en un comando dentro de un script para la shell? Aquí es donde entra /dev/null.
Vamos a verlo con un ejemplo.
Hemos creado un fichero llamado pruebas conteniendo la cadena “Hola Mundo”. Si queremos representar el contenido de ese fichero en la linea de comandos, podríamos hacerlo de la siguiente forma:
usuario@laptop:~$ cat prueba
Hola Mundo
Si el fichero no existiese o estuviera nombrado como pruebas (con una ‘s’ al final), obtendríamos el siguiente error en la consola:
usuario@laptop:~$ cat pruebas
cat: pruebas: No existe el fichero o el directorio
¿Que podríamos hacer para evitar el mensaje de error? Pues sencillamente redirigir la salida del comando, en caso de error, a un “cubo de basura”, es decir a /dev/null
¿Cómo especificamos que sea en caso de error? Aquí entran los valores estándar de entrada, salida y error para un programa: STDIN, STDOUT y STDERR (que pueden ser sustituidos por 0, 1 y 2 respectivamente). De esta forma, si ponemos…
usuario@laptop:~$ cat pruebas 2>/dev/null
usuario@laptop:~$
…veremos que no se producirá en la consola el mensaje de error.
Hay que tener cuidado porque la sintaxis es fundamental: entre los caracteres 2 y > no debe existir espacio. Sino, daría lo siguiente:
usuario@laptop:~$ cat pruebas 2 >/dev/null
cat: pruebas: No existe el fichero o el directorio
cat: 2: No existe el fichero o el directorio
En cambio, un espacio entre > y /dev/null no afectará negativamente el resultado.
También podríamos usar la redirección de errores, por ejemplo, para la captura de errores en un archivo de log de la siguiente forma:
usuario@laptop:~$ cat pruebas 2 >err.log
Otro caso interesante sería la recogida de resultados en otro fichero siempre y cuando no se produjese un error, para lo cual pondríamos:
usuario@laptop:~$ cat prueba 1>resultado_de_salida 2>err.log
Por último cabe poner la expresión «> /dev/null 2>&1» en la que se aúnan la salida estándar y la salida de error redireccionándolas para que en ningún caso se obtenga información de salida.
8 comentarios, deja el tuyo
Ah pero falta una de las utilidades más usadas que tiene /dev/null, que es vaciar archivos: $ cat /dev/null > file.log De esta forma, el archivo file.log quedar vacío. Agréguenlo!
Precisamente era la explicación que estaba buscando.
Apoyo la moción de agregarlo =)
Saludos !
Hola, primero que todo esta muy bien el artículo! lo segundo quisiera aportar algo con este enlace sobre el tema cron job en php desde Cpanel y lo tercero felicitaciones por el blog!
Buen articulo sobre dev/null, que pena creo comenté por error en el lugar equivocado antes! me disculpo
gracias buen aporte
Saludos estoy recibiendo ataque null. Utilizo andrirc y me llega un privado de mi mismo nick con la palabra Null. 2 segundo después se cierra el programa he estado leyendo y por lo que veo esto solo lo puede hacer la Shell no alguien externo. He tratado de ignorarme /ignore -lrpcntikd y Nada me sorprende sigue llegando el comando. Si tienen alguna forma de tratar de bloquearlo se lo agradecería. Saludos
¿Que pasa si al ejecutar la sentencia no se coloca el simbolo >?
¿Podría alguien orientarme por favor?
Buenos dias, he instalado Debian netinst en ACER Extensa 5620Z – 32 bit.Una vez finalizada la instalación desde USB y retirado el pendrive para que arranque desde el disco duro (no vuelva a instalar desde el pen) pero en el momento de arrancar el sistema me pide:
debian login: xxxxxxxx (ok)
Password: xxxxxxxx (ok)
nil@debian:~$ ???? esto qué es? Qué debo poner ahí?
Sin esta orden no puedo avanzar con el arranque del sistema.
Pueden ustedes ayudarme? No sé como debo continuar.
Muchas gracias. Saludos cordiales.