Multiplexación de salida en Linux

LinuxBeginner
Practicar Ahora

Introducción

El comando tee en Linux es una utilidad poderosa que te permite ver la salida de un comando en la terminal mientras la guardas simultáneamente en un archivo. Esta funcionalidad es especialmente útil para administradores de sistemas y desarrolladores que necesitan tanto inspeccionar la salida en tiempo real como preservarla para un análisis posterior.

Este laboratorio (LabEx) te introducirá en los fundamentos de la multiplexación de salida utilizando el comando tee. Aprenderás cómo mostrar la salida y guardarla al mismo tiempo, redirigir el error estándar y anexar la salida a archivos existentes. Estas habilidades son esenciales para una gestión efectiva de registros, depuración y monitoreo del sistema en entornos Linux.

Comprender los conceptos básicos del comando tee

El comando tee en Linux toma su nombre de la unión de tubería en forma de T en la plomería, que divide el flujo de agua en dos direcciones. De manera similar, el comando tee divide la salida de un comando en dos direcciones: hacia la terminal y hacia un archivo.

Comencemos navegando a nuestro directorio de trabajo:

cd /home/labex/project

Crear un archivo de prueba

Primero, creemos un simple archivo de texto que podamos utilizar para nuestros experimentos:

echo "Hello, World" > hello.txt

Este comando crea un archivo llamado hello.txt que contiene el texto "Hello, World".

Usar el comando tee

Ahora, usemos el comando tee para mostrar el contenido de hello.txt en la terminal mientras lo copiamos a otro archivo:

cat hello.txt | tee copy.txt

Deberías ver la siguiente salida en tu terminal:

Hello, World

La parte cat hello.txt lee el contenido del archivo hello.txt. El símbolo de tubería | toma esa salida y la envía al comando tee. El comando tee luego muestra el texto en la terminal y al mismo tiempo lo escribe en el archivo copy.txt.

Verifiquemos que el contenido se haya copiado realmente a copy.txt:

cat copy.txt

Deberías ver la misma salida:

Hello, World

Comprender la estructura del comando

La sintaxis básica del comando tee es:

command | tee filename

Donde:

  • command es cualquier comando que genere salida
  • | (tubería) envía la salida del comando a tee
  • tee es el comando en sí
  • filename es el nombre del archivo donde se guardará la salida

Redirigiendo el error estándar con tee

En Linux, los programas pueden enviar información a través de dos canales principales:

  • Salida estándar (stdout): Salida normal del programa
  • Error estándar (stderr): Mensajes de error y diagnósticos

Por defecto, el comando tee solo captura la salida estándar. Sin embargo, en muchas situaciones, es posible que desees capturar también los mensajes de error. Aquí es donde entra en juego la redirección de salida.

Comprender la redirección del error estándar

Creemos un script que envíe tanto salida estándar como error estándar. Naveguemos primero al directorio del proyecto (si no estás ya allí):

cd /home/labex/project

Ahora, ejecutemos un comando que produzca tanto salida estándar como error estándar:

echo "This is standard output"
ls /nonexistentfile

Deberías ver una salida similar a esta:

This is standard output
ls: cannot access '/nonexistentfile': No such file or directory

Observa que el mensaje de error del comando ls se envía directamente a la terminal.

Redirigir el error estándar a un archivo

Veamos primero cómo podemos redirigir solo la salida de error a un archivo:

echo "This is standard output"
ls /nonexistentfile 2> error.log

Esta vez, solo deberías ver:

This is standard output

El mensaje de error se ha redirigido al archivo error.log. La sintaxis 2> le dice a la shell que redirija el error estándar (descriptor de archivo 2) al archivo especificado.

Verifiquemos el contenido de error.log:

cat error.log

Deberías ver:

ls: cannot access '/nonexistentfile': No such file or directory

Capturar tanto la salida como el error con tee

Ahora, usemos tee para capturar tanto la salida estándar como el error estándar en un archivo mientras los mostramos también en la terminal:

{
  echo "This is standard output"
  ls /nonexistentfile
} 2>&1 | tee both.log

Deberías ver tanto la salida como el error en la terminal:

This is standard output
ls: cannot access '/nonexistentfile': No such file or directory

Veamos el contenido de both.log:

cat both.log

Deberías ver la misma salida:

This is standard output
ls: cannot access '/nonexistentfile': No such file or directory

Comprender la estructura del comando

En el comando 2>&1 | tee both.log:

  • { ... } agrupa múltiples comandos juntos
  • 2>&1 redirige el error estándar (descriptor de archivo 2) a la salida estándar (descriptor de archivo 1)
  • | canaliza la salida combinada al comando tee
  • tee both.log muestra la salida en la terminal y la escribe en both.log

Esta técnica es especialmente útil para registrar la salida de comandos durante el mantenimiento del sistema o la resolución de problemas.

Anexando salida con tee

Por defecto, el comando tee sobrescribe el archivo de destino cada vez que se utiliza. Sin embargo, en muchos escenarios, es posible que desees agregar nueva información a un archivo existente en lugar de reemplazar su contenido. Aquí es donde la opción -a (anexar) resulta útil.

Comprender la opción de anexar

Navega al directorio del proyecto si aún no estás allí:

cd /home/labex/project

Primero, creemos un archivo con información del sistema:

uname -a | tee system_info.log

Este comando mostrará la información de tu sistema en la terminal y la guardará en system_info.log. La salida se verá algo así (tu salida puede ser diferente):

Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

Ahora, veamos el contenido del archivo:

cat system_info.log

Deberías ver la misma información del sistema.

Anexar información al archivo

Ahora, anexemos más información a este archivo utilizando la opción -a:

echo "Date and time: $(date)" | tee -a system_info.log

Esto mostrará algo como:

Date and time: Wed May 3 14:22:34 UTC 2023

La bandera -a le dice a tee que anexe la salida al archivo en lugar de sobrescribirlo.

Veamos el contenido del archivo nuevamente:

cat system_info.log

Ahora deberías ver tanto la información del sistema como la fecha:

Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
Date and time: Wed May 3 14:22:34 UTC 2023

Agregar más información

Anexemos aún más información a nuestro archivo de registro:

echo "Disk usage:" | tee -a system_info.log
df -h | tee -a system_info.log

Esto mostrará información de uso de disco y la anexará a nuestro archivo de registro. La salida variará según tu sistema, pero podría verse algo así:

Disk usage:
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        19G  5.8G   13G  32% /
tmpfs           494M     0  494M   0% /dev/shm
tmpfs           198M  1.1M  197M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sda15      105M  5.2M  100M   5% /boot/efi
tmpfs           100M  4.0K  100M   1% /run/user/1000

Verifiquemos el contenido de nuestro archivo de registro una vez más:

cat system_info.log

Ahora deberías ver toda la información que hemos agregado:

Linux ubuntu 5.15.0-1031-aws #35-Ubuntu SMP Fri Feb 10 02:14:02 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
Date and time: Wed May 3 14:22:34 UTC 2023
Disk usage:
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        19G  5.8G   13G  32% /
tmpfs           494M     0  494M   0% /dev/shm
tmpfs           198M  1.1M  197M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sda15      105M  5.2M  100M   5% /boot/efi
tmpfs           100M  4.0K  100M   1% /run/user/1000

Comprender la estructura del comando

La sintaxis para anexar con tee es:

command | tee -a filename

Donde:

  • command es cualquier comando que produzca salida
  • | (tubería) envía la salida del comando a tee
  • tee es el comando en sí
  • -a es la opción para anexar al archivo en lugar de sobrescribirlo
  • filename es el nombre del archivo donde se anexará la salida

Este enfoque es especialmente útil para:

  • Construir archivos de registro con el tiempo
  • Capturar la salida de múltiples comandos en un solo archivo
  • Mantener un registro de los estados o operaciones del sistema

Resumen

En este laboratorio, has aprendido cómo utilizar el comando tee para la multiplexación de salida en Linux. Esta poderosa utilidad te permite ver la salida de los comandos en la terminal mientras la guardas simultáneamente en archivos, lo que la convierte en una herramienta esencial para administradores de sistemas y desarrolladores.

A continuación, se presentan las habilidades clave que has adquirido:

  1. Uso básico de tee: Aprendiste cómo utilizar tee para mostrar la salida en la terminal mientras la guardas simultáneamente en un archivo.

  2. Redirección del error estándar: Dominaste cómo capturar tanto la salida estándar como el error estándar utilizando la redirección 2>&1 en combinación con tee, lo cual es crucial para un registro completo.

  3. Anexar salida: Descubriste cómo utilizar la opción -a con tee para anexar la salida a archivos existentes en lugar de sobrescribirlos, lo que te permite construir registros de forma incremental.

Estas técnicas son valiosas para diversas tareas en Linux, incluyendo:

  • Crear registros detallados para la depuración
  • Monitorear actividades del sistema
  • Documentar salidas de comandos durante la administración del sistema
  • Conservar resultados de comandos para consultas futuras

Comprender cómo administrar eficazmente la salida en Linux es una habilidad fundamental que te será de gran ayuda a medida que avances en tu recorrido con sistemas Linux.