Redirección en Shell: ¿Qué significa >/dev/null 2>&1?

En scripts de shell, es común encontrarse con expresiones como >/dev/null 2>&1. Aunque muchas personas las usan sin entender su funcionamiento interno, un pequeño error al escribirlas (como cambiar el orden) puede causar problemas inesperados. Este artículo explora qué ocurre detrás de esta sintaxis.

Introducción a la redirección en Shel

Al igual que en otros programas, los scripts de shell manejan entradas y salidas. Por defecto, una aplicación interactúa con el usuario mediante el teclado para la entrada y muestra resultados en la pantalla. Sin embargo, también es posible redirigir estas entradas y salidas hacia archivos o dispositivos específicos.

Descriptores de archivo

Cuando se ejecuta un comando en shell, automáticamente se abren tres descriptores de archivo:

Tipo Descriptor Comportamiento predeterminado
Entrada estándar (stdin) 0 Datos desde el teclado
Salida estándar (stdout) 1 Resultados mostrados en pantalla
Salida de error (stderr) 2 Errores mostrados en pantalla

Estos descriptores pueden ser redirigidos a otros destinos, permitiendo guardar o manipular la salida del programa.

Redirección de salida

La redirección de salida utiliza símbolos como > o >>. Aquí hay algunos ejemplos básicos:

Sintaxis Descripción
comando > archivo Reemplaza el contenido de "archivo" con la salida estándar del comando.
comando >> archivo Agrega la salida estándar del comando al final de "archivo".
comando 2> archivo Guarda errores en "archivo".
comando &> archivo Guarda tanto salida estándar como errores en "archivo".

Ejemplo práctico

Supongamos un directorio con un único archivo llamado a.txt:

# tree
└── a.txt
1 directory, 1 file

# ls a.txt b.txt
ls: cannot access 'b.txt': No such file or directory
a.txt

Aquí, a.txt es la salida estándar y el mensaje de error proviene de stderr. Podemos redirigir cada uno por separado:

# ls a.txt b.txt > out
ls: cannot access 'b.txt': No such file or directory

# cat out
a.txt

El error sigue apareciendo en pantala porque no lo hemos redirigido.

# ls a.txt b.txt 2> err

# cat err
ls: cannot access 'b.txt': No such file or directory

Ahora ambos flujos han sido manejados correctamente.

Redirección de entrada

La redirección de entrada funciona de manera similar, utilizando <:

# cat < a.txt
Contenido de a.txt

También podemos usar << para insertar texto directamente:

# cat > nuevo.txt <<EOF
> línea 1
> línea 2
> EOF

# cat nuevo.txt
línea 1
línea 2

Este método es útil para crear archivos rápidamente dentro del script.


Uso avanzado: combinación de flujos

Consideremos ahora la famosa expresión /dev/null 2>&1.

¿Qué hace /dev/null?

/dev/null es un dispositivo especial que descarta todo lo que recibe. Al redirigir hacia él, eliminamos cualquier salida asociada.

¿Qué significa 2>&1?

Esta sintaxis vincula el flujo de error (2) al mismo destino que la salida estándar (1). Esto asegura que ambos flujos vayan al mismo lugar.

Por ejemplo:

# comando > /dev/null 2>&1

Aquí, tanto la salida estándar como los errores son enviados a /dev/null, eliimnando cualquier tipo de salida visible.

¿Qué pasa si cambio el orden?

Si inviertes el orden a 2>&1 > /dev/null, obtienes un comportamiento diferente. En este caso:

  1. 2>&1: Vincula el flujo de error al flujo estándar actual (pantalla).
  2. > /dev/null: Descarta solo la salida estándar.

Como resultado, los errores seguirán mostrándose en pantalla.

Orden Salida estándar Salida de error
> /dev/null 2>&1 Descartada Descartada
2>&1 > /dev/null Descartada Mostrada

Comparación con otras alternativas

Otra forma común es > /dev/null 2> /dev/null. Aunque parece equivalente, tiene un problema: abre /dev/null dos veces, lo que puede causar ineficiencias o incluso conflictos si ambos flujos intentan escribir simultáneamente.

Un ejemplo más claro:

# ls a.txt b.txt > out 2> out

Este enfoque puede producir resultados impredecibles debido a la sobreescritura concurrente.


Combinación con nohup

Para ejecutar procesos en segundo plano sin mostrar salida, se usa:

# nohup mi_comando > /dev/null 2>&1 &

Esto garantiza que ni la salida estándar ni los errores interfieran con la terminal.

Etiquetas: shell bash redirection

Publicado el 9-6 12:09