Cómo usar 'tee' para capturar el error estándar

LinuxBeginner
Practicar Ahora

Introducción

Este tutorial le guiará a través del trabajo con los flujos estándar de Linux, con un enfoque en la comprensión y gestión del flujo de error estándar (stderr). Aprenderá a usar el poderoso comando tee para capturar y procesar la salida de stderr, una habilidad valiosa para el manejo de errores y el registro (logging) en sistemas Linux.

Comprensión de los Flujos Estándar de Linux

Linux utiliza tres flujos fundamentales para manejar las operaciones de entrada y salida. Estos flujos forman la base de cómo los programas se comunican en un entorno Linux.

¿Qué son los Flujos Estándar?

Abra una terminal en su entorno Linux. Exploraremos el concepto de flujos estándar a través de ejemplos prácticos.

Los flujos estándar son canales de comunicación que conectan los programas con su entorno. Linux tiene tres flujos estándar:

  1. Entrada Estándar (stdin) - Descriptor de archivo 0
  2. Salida Estándar (stdout) - Descriptor de archivo 1
  3. Error Estándar (stderr) - Descriptor de archivo 2

Veamos estos flujos en acción con algunos comandos simples.

Demostración de la Entrada Estándar (stdin)

La entrada estándar es la forma en que los programas reciben datos, típicamente desde la entrada del teclado.

Escriba el siguiente comando en su terminal:

cat

Ahora escriba cualquier texto y presione Enter. El comando cat lee de stdin y lo envía a stdout. Escriba algunas líneas más de texto.

Para salir del comando cat, presione Ctrl+D (que señala el fin del archivo - end-of-file).

Demostración de la Salida Estándar (stdout)

La salida estándar es donde los programas envían su salida normal.

Ejecute este comando:

echo "Este mensaje va a la salida estándar"

Debería ver:

Este mensaje va a la salida estándar

El comando echo envía el texto a stdout, que se muestra en su terminal.

Demostración del Error Estándar (stderr)

El error estándar es donde los programas envían mensajes de error y advertencias.

Ejecute este comando para generar un error:

ls /directorio_inexistente

Debería ver un mensaje de error similar a:

ls: no se puede acceder a '/directorio_inexistente': No existe el fichero o el directorio

Este mensaje de error se envía a stderr, pero aparece en su terminal al igual que stdout.

Distinguir entre stdout y stderr

Para ver la diferencia entre stdout y stderr, redirijámoslos por separado:

ls /home /directorio_inexistente > output.txt 2> error.txt

Ahora examine el contenido de cada archivo:

cat output.txt
cat error.txt

Debería ver que output.txt contiene la lista del directorio /home, mientras que error.txt contiene el mensaje de error para el directorio inexistente.

Comprender cómo funcionan estos flujos es crucial para controlar la entrada y salida de los programas en Linux.

Introducción al comando tee

Ahora que comprende los flujos estándar, aprendamos sobre el comando tee, que ofrece una forma poderosa de gestionar estos flujos.

¿Qué es el comando tee?

El comando tee en Linux toma la entrada y la envía tanto a la salida estándar como a uno o más archivos simultáneamente. Su nombre proviene del divisor en forma de T utilizado en fontanería que envía agua en dos direcciones.

Exploremos cómo funciona tee con un ejemplo básico:

echo "Hola, comando tee" | tee hola.txt

Debería ver:

Hola, comando tee

Este texto aparece en su terminal y también se guarda en hola.txt. Confirme esto verificando el archivo:

cat hola.txt

Combinando tee con la Salida Estándar

Veamos cómo podemos usar tee con la salida del programa:

ls -la ~ | tee contenido_home.txt

Este comando lista el contenido de su directorio personal, lo muestra en la pantalla y lo guarda en contenido_home.txt.

Manejo básico de errores con tee

Por defecto, tee solo captura la salida estándar. Para capturar también el error estándar, necesitamos redirigir stderr a stdout primero.

Pruebe este ejemplo:

ls /home /directorio_inexistente 2>&1 | tee salida_mixta.txt

La parte 2>&1 redirige stderr (descriptor de archivo 2) a stdout (descriptor de archivo 1), combinando ambos flujos. El comando tee luego captura esta salida combinada.

Examine el contenido del archivo:

cat salida_mixta.txt

Debería ver tanto la lista del directorio como el mensaje de error en el archivo.

Añadiendo la salida en lugar de sobrescribir

Si desea añadir a un archivo en lugar de sobrescribirlo, use la opción -a:

echo "Primera línea" | tee log.txt
echo "Segunda línea" | tee -a log.txt

Compruebe el contenido:

cat log.txt

Debería ver ambas líneas en el archivo, ya que el segundo comando añadió al archivo en lugar de sobrescribirlo.

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:

  1. Ejecuta su script
  2. Redirige stdout a tee stdout.log, que lo muestra en la pantalla y lo guarda en un archivo
  3. 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:

  1. Enviar la salida normal a la pantalla
  2. Enviar los errores tanto a la pantalla como a un archivo de registro
  3. 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:

  1. Mostrará toda la salida (tanto stdout como stderr) en la pantalla
  2. 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:

  1. Intenta descargar un archivo que no existe
  2. Muestra toda la salida en la pantalla, incluyendo el progreso y los errores
  3. 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.

Resumen

En este tutorial, ha aprendido técnicas esenciales para gestionar los flujos estándar en Linux, con un enfoque en el manejo de errores utilizando el comando tee. Ahora comprende:

  • Los tres flujos estándar en Linux: stdin, stdout y stderr
  • Cómo usar el comando tee para capturar la salida mientras la muestra en la pantalla
  • Cómo redirigir stderr a stdout y capturar ambos con tee
  • Técnicas avanzadas para separar y registrar diferentes flujos de salida
  • Cómo implementar el registro de errores práctico en escenarios del mundo real

Estas habilidades son valiosas para crear scripts robustos, solucionar problemas de aplicaciones y mantener registros completos en entornos Linux. La capacidad de gestionar la salida de error estándar de manera efectiva le ayudará a desarrollar aplicaciones Linux más profesionales y mantenibles.