Manejo avanzado de errores con tee
Ahora que comprende los conceptos básicos de tee, exploremos usos más avanzados para el manejo de errores y el registro (logging).
Separando la Salida Estándar y el Error Estándar
A veces, desea capturar stdout y stderr por separado mientras sigue mostrando ambos en la terminal. Creemos un script que genere ambos tipos de salida:
nano test_script.sh
Añada el siguiente contenido al script:
#!/bin/bash
echo "Esta es la salida estándar"
echo "Este es el error estándar" >&2
ls /home
ls /directorio_inexistente
Guarde el archivo (presione Ctrl+O, luego Enter) y salga (presione Ctrl+X).
Haga que el script sea ejecutable:
chmod +x test_script.sh
Ahora ejecute el script con stdout y stderr capturados por separado:
./test_script.sh > >(tee stdout.log) 2> >(tee stderr.log >&2)
Este comando complejo:
- Ejecuta su script
- Redirige stdout a
tee stdout.log, que lo muestra en la pantalla y lo guarda en un archivo
- Redirige stderr a
tee stderr.log >&2, que lo muestra en la pantalla y lo guarda en un archivo
Examine los resultados:
cat stdout.log
cat stderr.log
Debería ver la salida regular en stdout.log y los mensajes de error en stderr.log.
Creando un registro de errores completo
Para un registro completo, es posible que desee:
- Enviar la salida normal a la pantalla
- Enviar los errores tanto a la pantalla como a un archivo de registro
- Marcar con la hora los errores para facilitar el seguimiento
Creemos un script para demostrar esto:
nano logging_script.sh
Añada el siguiente contenido:
#!/bin/bash
## Función para generar una marca de tiempo
timestamp() {
date +"%Y-%m-%d %H:%M:%S"
}
## Echo con marca de tiempo a stderr
echo_error() {
echo "$(timestamp) - ERROR: $1" >&2
}
## Salida normal
echo "Iniciando el script"
## Salida de error
echo_error "Algo salió mal"
## Más salida normal
echo "El script continúa a pesar del error"
## Otro error
echo_error "Otro problema ocurrió"
## Salida final
echo "Script completado"
Guarde y haga que el script sea ejecutable:
chmod +x logging_script.sh
Ahora ejecútelo con registro de errores:
./logging_script.sh 2> >(tee -a error_log.txt >&2)
Esto hará lo siguiente:
- Mostrará toda la salida (tanto stdout como stderr) en la pantalla
- Además, capturará stderr en el archivo
error_log.txt
Compruebe el registro de errores:
cat error_log.txt
Debería ver solo los mensajes de error con marcas de tiempo, lo que facilita su seguimiento.
Aplicación en el mundo real: Comando con progreso y manejo de errores
Creemos un ejemplo práctico que descargue un archivo, mostrando el progreso en la pantalla mientras registra los errores:
wget https://example.com/archivo_inexistente.txt 2> >(tee -a download_errors.log >&2)
Este comando:
- Intenta descargar un archivo que no existe
- Muestra toda la salida en la pantalla, incluyendo el progreso y los errores
- Además, registra cualquier error en
download_errors.log
Compruebe el registro de errores:
cat download_errors.log
El registro de errores contiene solo los mensajes de error del intento de descarga fallido.
Estas técnicas le permiten construir sistemas sofisticados de manejo de errores y registro utilizando comandos estándar de Linux.