Redirigir el Error Estándar y Combinar Flujos
En este paso, aprenderás a redirigir el error estándar (stderr) y a combinar stdout y stderr en un único flujo. Esto es crucial para gestionar los mensajes de error generados por los comandos, permitiéndote registrarlos o descartarlos según sea necesario.
Recuerda que stderr es el descriptor de archivo 2. Usamos 2> para redirigir los mensajes de error.
Redireccionamiento del Error Estándar a un Archivo
A veces, los comandos producen mensajes de error que deseas capturar por separado de su salida estándar.
-
Asegúrate de estar en tu directorio ~/project.
cd ~/project
[labex@host project]$
-
Intentemos listar el contenido de un directorio que no existe. Esto generará un mensaje de error.
ls non_existent_directory
ls: cannot access 'non_existent_directory': No such file or directory
Puedes ver el mensaje de error impreso directamente en la terminal.
-
Ahora, redirijamos este mensaje de error a un archivo llamado errors.log.
ls non_existent_directory 2> errors.log
Esta vez, no verás el mensaje de error en tu terminal.
-
Verifica el contenido de errors.log.
cat errors.log
ls: cannot access 'non_existent_directory': No such file or directory
El mensaje de error ahora se almacena en el archivo.
Descartando el Error Estándar
A menudo, es posible que desees ejecutar un comando que produce mensajes de error ruidosos que no te importan. En tales casos, puedes redirigir stderr a /dev/null. /dev/null es un archivo de dispositivo especial que descarta todos los datos escritos en él.
-
Intenta el comando ls con el directorio que no existe de nuevo, pero esta vez, descarta el error.
ls non_existent_directory 2> /dev/null
No verás ninguna salida en la terminal, y no se guarda ningún mensaje de error en un archivo.
Combinando la Salida Estándar y el Error Estándar
Hay situaciones en las que deseas capturar tanto stdout como stderr en el mismo archivo. Esto se puede hacer de varias maneras.
Método 1: > file 2>&1
Este método redirige stdout a un archivo, y luego redirige stderr a la misma ubicación que stdout. El orden 2>&1 es importante: significa "redirigir el descriptor de archivo 2 (stderr) al mismo lugar que el descriptor de archivo 1 (stdout)".
-
Creemos un comando que produzca tanto salida estándar como error estándar. Usaremos find para buscar un archivo en un directorio donde tenemos permisos y en un directorio donde no los tenemos.
find ~/project /root -name "current_datetime.txt" > combined_output.log 2>&1
Aquí, find ~/project -name "current_datetime.txt" producirá stdout (si se encuentra), y find /root -name "current_datetime.txt" probablemente producirá stderr debido a problemas de permisos.
-
Examina el archivo combined_output.log.
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
Puedes ver que tanto la salida exitosa (la ruta al archivo) como el mensaje de error se capturan en el mismo archivo.
Método 2: &> file (Específico de Bash)
Bash proporciona una abreviatura para combinar stdout y stderr en un archivo: &>. Esto es equivalente a > file 2>&1.
-
Intentemos el mismo comando find usando la abreviatura &>.
find ~/project /root -name "file_list.txt" &> combined_output_shorthand.log
-
Verifica el contenido de combined_output_shorthand.log.
cat combined_output_shorthand.log
/home/labex/project/file_list.txt
find: ‘/root’: Permission denied
El resultado es el mismo que el método anterior, lo que demuestra la conveniencia de &>.
Anexando Flujos Combinados
Al igual que con stdout, puedes anexar stdout y stderr combinados a un archivo usando >> file 2>&1 o &>> file.
-
Anexa más salida y errores a combined_output.log.
find ~/project /root -name "line_count.txt" >> combined_output.log 2>&1
-
Visualiza el combined_output.log actualizado.
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
/home/labex/project/line_count.txt
find: ‘/root’: Permission denied
La nueva salida y los errores se anexan al contenido existente.
Ahora has aprendido con éxito a redirigir el error estándar y a combinar la salida estándar y el error estándar en un único archivo. Este conocimiento es esencial para tareas de scripting y administración de sistemas robustas.