Exploremos qué sucede cuando un comando produce un error. Intenta listar el contenido de un directorio que no existe y redirige la salida a un archivo llamado peanuts.txt.
ls /fake/directory > peanuts.txt
En lugar de un prompt limpio, verás un mensaje de error en tu pantalla:
ls: cannot access /fake/directory: No such file or directory
Quizás te preguntes por qué este mensaje no se envió al archivo. Esto se debe a que hay otra secuencia de E/S en juego: error estándar, o stderr.
¿Qué es el Error Estándar en Linux?
En Linux, stderr es una secuencia de salida predeterminada utilizada por los programas para enviar mensajes de error y diagnósticos. Está completamente separada de la secuencia de salida estándar (stdout), que se utiliza para la salida normal del programa. Por defecto, tanto stdout como stderr envían su salida a la pantalla de tu terminal, razón por la cual ves el mensaje de error directamente.
Para controlar stderr, necesitas un método de redirección diferente.
Entendiendo los Descriptores de Archivo
Para gestionar secuencias de E/S como stdin, stdout y stderr, el sistema utiliza descriptores de archivo. Un descriptor de archivo es un número no negativo que el kernel utiliza para identificar un archivo o secuencia abierta. Los descriptores de archivo predeterminados son:
0: stdin (entrada estándar)1: stdout (salida estándar)2: stderr (error estándar)
El número 2 es el descriptor de archivo de stderr dedicado, y podemos usarlo para controlar a dónde van los mensajes de error.
Redirigiendo stderr a un Archivo
Para redirigir stderr a un archivo, usas el descriptor de archivo 2 seguido del operador >. Este comando enviará cualquier mensaje de error al archivo stderr especificado.
ls /fake/directory 2> peanuts.txt
Ahora, tu terminal estará en silencio, y el mensaje de error estará dentro de peanuts.txt.
Combinando stdout y stderr
¿Qué pasa si quieres capturar tanto la salida normal como los mensajes de error en el mismo archivo? Puedes lograr esto redirigiendo ambas secuencias.
ls /fake/directory /etc/passwd > peanuts.txt 2>&1
Analicemos esto:
> peanuts.txtredirigestdout(descriptor de archivo 1) al archivopeanuts.txt.2>&1redirigestderr(descriptor de archivo 2) a la misma ubicación a la que apunta actualmentestdout(descriptor de archivo 1).
El orden es importante. 2>&1 envía stderr al destino actual de stdout. En este caso, stdout apunta a un archivo, por lo que stderr también se envía a ese archivo.
Una forma más moderna y corta de redirigir tanto stdout como stderr es usando &>.
ls /fake/directory /etc/passwd &> peanuts.txt
Descartando Mensajes de Error
A veces, es posible que desees ejecutar un comando e ignorar por completo cualquier mensaje de error potencial. Para hacer esto, puedes redirigir stderr a un archivo especial llamado /dev/null, que descarta cualquier dato escrito en él.
ls /fake/directory 2> /dev/null
Este comando se ejecutará, y cualquier salida de error de stderr se enviará a /dev/null y se descartará, dejando tu pantalla limpia.