Multiplexação de Saída no Linux

LinuxBeginner
Pratique Agora

Introdução

O comando tee no Linux é um utilitário poderoso que permite visualizar a saída de um comando no terminal enquanto a salva simultaneamente em um arquivo. Essa funcionalidade é particularmente útil para administradores de sistema e desenvolvedores que precisam inspecionar a saída em tempo real e preservá-la para análise posterior.

Este laboratório irá apresentá-lo aos fundamentos da multiplexação de saída usando o comando tee. Você aprenderá como exibir a saída e salvá-la simultaneamente, redirecionar o erro padrão e anexar a saída a arquivos existentes. Essas habilidades são essenciais para o gerenciamento eficaz de logs, depuração e monitoramento de sistemas em ambientes Linux.

Entendendo os Fundamentos do Comando tee

O comando tee no Linux recebe seu nome da conexão em forma de T usada em encanamentos, que divide o fluxo de água em duas direções. De forma semelhante, o comando tee divide a saída de um comando em duas direções: para o terminal e para um arquivo.

Vamos começar navegando para o nosso diretório de trabalho:

cd /home/labex/project

Criando um Arquivo de Teste

Primeiro, vamos criar um arquivo de texto simples que podemos usar para nossos experimentos:

echo "Hello, World" > hello.txt

Este comando cria um arquivo chamado hello.txt contendo o texto "Hello, World".

Usando o Comando tee

Agora, vamos usar o comando tee para exibir o conteúdo de hello.txt no terminal enquanto também o copia para outro arquivo:

cat hello.txt | tee copy.txt

Você deve ver a seguinte saída no seu terminal:

Hello, World

A parte cat hello.txt lê o conteúdo do arquivo hello.txt. O símbolo de pipe | pega essa saída e a envia para o comando tee. O comando tee então exibe o texto no terminal e simultaneamente o escreve no arquivo copy.txt.

Vamos verificar se o conteúdo foi realmente copiado para copy.txt:

cat copy.txt

Você deve ver a mesma saída:

Hello, World

Compreendendo a Estrutura do Comando

A sintaxe básica do comando tee é:

command | tee filename

Onde:

  • command é qualquer comando que produz saída
  • | (pipe) envia a saída do comando para tee
  • tee é o próprio comando
  • filename é o nome do arquivo onde a saída será salva

Redirecionando o Erro Padrão com tee

No Linux, os programas podem gerar informações por meio de dois canais principais:

  • Saída padrão (stdout): Saída normal do programa
  • Erro padrão (stderr): Mensagens de erro e diagnósticos

Por padrão, o comando tee captura apenas a saída padrão. No entanto, em muitas situações, você pode querer capturar também as mensagens de erro. É aqui que a redireção de saída entra em ação.

Compreendendo a Redireção de Erro Padrão

Vamos criar um script que gera tanto a saída padrão quanto o erro padrão. Navegue para o diretório do projeto primeiro (se você ainda não estiver lá):

cd /home/labex/project

Agora, vamos executar um comando que produzirá tanto a saída padrão quanto o erro padrão:

echo "This is standard output"
ls /nonexistentfile

Você deve ver uma saída semelhante a esta:

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

Observe que a mensagem de erro do comando ls vai diretamente para o terminal.

Redirecionando o Erro Padrão para um Arquivo

Vamos primeiro ver como podemos redirecionar apenas a saída de erro para um arquivo:

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

Desta vez, você deve ver apenas:

This is standard output

A mensagem de erro foi redirecionada para o arquivo error.log. A sintaxe 2> diz ao shell para redirecionar o erro padrão (descritor de arquivo 2) para o arquivo especificado.

Vamos verificar o conteúdo de error.log:

cat error.log

Você deve ver:

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

Capturando Tanto a Saída Quanto o Erro com tee

Agora, vamos usar tee para capturar tanto a saída padrão quanto o erro padrão em um arquivo, enquanto também os exibimos no terminal:

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

Você deve ver tanto a saída quanto o erro no terminal:

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

Vamos verificar o conteúdo de both.log:

cat both.log

Você deve ver a mesma saída:

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

Compreendendo a Estrutura do Comando

No comando 2>&1 | tee both.log:

  • { ... } agrupa vários comandos
  • 2>&1 redireciona o erro padrão (descritor de arquivo 2) para a saída padrão (descritor de arquivo 1)
  • | canaliza a saída combinada para o comando tee
  • tee both.log exibe a saída no terminal e a escreve em both.log

Essa técnica é particularmente útil para registrar a saída de comandos durante a manutenção do sistema ou solução de problemas.

Anexando Saída com tee

Por padrão, o comando tee sobrescreve o arquivo de destino cada vez que é usado. No entanto, em muitos cenários, você pode querer adicionar novas informações a um arquivo existente, em vez de substituir seu conteúdo. É aqui que a opção -a (anexar) é útil.

Compreendendo a Opção Anexar

Navegue para o diretório do projeto, se você ainda não estiver lá:

cd /home/labex/project

Vamos primeiro criar um arquivo com informações do sistema:

uname -a | tee system_info.log

Este comando exibirá as informações do seu sistema no terminal e as salvará em system_info.log. A saída será algo parecido com isto (sua saída pode 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

Agora, vamos verificar o conteúdo do arquivo:

cat system_info.log

Você deve ver as mesmas informações do sistema.

Anexando Informações ao Arquivo

Agora, vamos anexar mais informações a este arquivo usando a opção -a:

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

Isso exibirá algo como:

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

A flag -a diz ao tee para anexar a saída ao arquivo em vez de sobrescrevê-lo.

Vamos verificar o conteúdo do arquivo novamente:

cat system_info.log

Você deve ver agora tanto as informações do sistema quanto a data:

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

Adicionando Mais Informações

Vamos anexar ainda mais informações ao nosso arquivo de log:

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

Isso exibirá informações de uso do disco e as anexará ao nosso arquivo de log. A saída variará dependendo do seu sistema, mas pode ser algo parecido com isto:

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

Vamos verificar o conteúdo do nosso arquivo de log mais uma vez:

cat system_info.log

Você deve ver agora todas as informações que adicionamos:

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

Compreendendo a Estrutura do Comando

A sintaxe para anexar com tee é:

command | tee -a filename

Onde:

  • command é qualquer comando que produz saída
  • | (pipe) envia a saída do comando para tee
  • tee é o próprio comando
  • -a é a opção para anexar ao arquivo em vez de sobrescrevê-lo
  • filename é o nome do arquivo onde a saída será anexada

Essa abordagem é particularmente útil para:

  • Construir arquivos de log ao longo do tempo
  • Capturar a saída de vários comandos em um único arquivo
  • Manter um registro de estados ou operações do sistema

Resumo

Neste laboratório, você aprendeu a usar o comando tee para multiplexação de saída no Linux. Este utilitário poderoso permite que você visualize a saída do comando no terminal, enquanto simultaneamente a salva em arquivos, tornando-o uma ferramenta essencial para administradores de sistema e desenvolvedores.

Aqui estão as principais habilidades que você adquiriu:

  1. Uso básico de tee: Você aprendeu a usar tee para exibir a saída no terminal, enquanto simultaneamente a salva em um arquivo.

  2. Redirecionando o Erro Padrão: Você dominou como capturar tanto a saída padrão quanto o erro padrão usando a redireção 2>&1 em combinação com tee, o que é crucial para um registro abrangente.

  3. Anexando Saída: Você descobriu como usar a opção -a com tee para anexar a saída a arquivos existentes, em vez de sobrescrevê-los, permitindo que você construa logs incrementalmente.

Essas técnicas são valiosas para várias tarefas no Linux, incluindo:

  • Criar logs detalhados para depuração
  • Monitorar atividades do sistema
  • Documentar as saídas de comandos durante a administração do sistema
  • Preservar os resultados dos comandos para referência futura

Compreender como gerenciar efetivamente a saída no Linux é uma habilidade fundamental que o servirá bem à medida que você avança em sua jornada com sistemas Linux.