Redirecionar Erros Padrão e Combinar Fluxos
Nesta etapa, você aprenderá como redirecionar o erro padrão (stderr) e como combinar stdout e stderr em um único fluxo. Isso é crucial para gerenciar mensagens de erro geradas por comandos, permitindo que você as registre (log) ou descarte conforme necessário.
Lembre-se que stderr é o descritor de arquivo 2. Usamos 2> para redirecionar mensagens de erro.
Redirecionando o Erro Padrão para um Arquivo
Às vezes, os comandos produzem mensagens de erro que você deseja capturar separadamente de sua saída padrão.
-
Certifique-se de estar no seu diretório ~/project.
cd ~/project
[labex@host project]$
-
Vamos tentar listar o conteúdo de um diretório inexistente. Isso gerará uma mensagem de erro.
ls non_existent_directory
ls: cannot access 'non_existent_directory': No such file or directory
Você pode ver a mensagem de erro impressa diretamente no terminal.
-
Agora, vamos redirecionar esta mensagem de erro para um arquivo chamado errors.log.
ls non_existent_directory 2> errors.log
Desta vez, você não verá a mensagem de erro no seu terminal.
-
Verifique o conteúdo de errors.log.
cat errors.log
ls: cannot access 'non_existent_directory': No such file or directory
A mensagem de erro agora está armazenada no arquivo.
Descartando o Erro Padrão
Frequentemente, você pode querer executar um comando que produz mensagens de erro ruidosas das quais você não se importa. Nesses casos, você pode redirecionar stderr para /dev/null. /dev/null é um arquivo de dispositivo especial que descarta todos os dados escritos nele.
-
Tente o comando ls com o diretório inexistente novamente, mas desta vez, descarte o erro.
ls non_existent_directory 2> /dev/null
Você não verá nenhuma saída no terminal, e nenhuma mensagem de erro é salva em um arquivo.
Combinando Saída Padrão e Erro Padrão
Existem situações em que você deseja capturar tanto stdout quanto stderr no mesmo arquivo. Isso pode ser feito de algumas maneiras.
Método 1: > file 2>&1
Este método redireciona stdout para um arquivo e, em seguida, redireciona stderr para o mesmo local que stdout. A ordem 2>&1 é importante: significa "redirecionar o descritor de arquivo 2 (stderr) para o mesmo lugar que o descritor de arquivo 1 (stdout)".
-
Vamos criar um comando que produza tanto saída padrão quanto erro padrão. Usaremos find para procurar um arquivo em um diretório onde temos permissões e em um diretório onde não temos.
find ~/project /root -name "current_datetime.txt" > combined_output.log 2>&1
Aqui, find ~/project -name "current_datetime.txt" produzirá stdout (se encontrado), e find /root -name "current_datetime.txt" provavelmente produzirá stderr devido a problemas de permissão.
-
Examine o arquivo combined_output.log.
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
Você pode ver que tanto a saída bem-sucedida (o caminho para o arquivo) quanto a mensagem de erro são capturadas no mesmo arquivo.
Método 2: &> file (Específico do Bash)
O Bash fornece uma abreviação para combinar stdout e stderr em um arquivo: &>. Isso é equivalente a > file 2>&1.
-
Vamos tentar o mesmo comando find usando a abreviação &>.
find ~/project /root -name "file_list.txt" &> combined_output_shorthand.log
-
Verifique o conteúdo de combined_output_shorthand.log.
cat combined_output_shorthand.log
/home/labex/project/file_list.txt
find: ‘/root’: Permission denied
O resultado é o mesmo que o método anterior, demonstrando a conveniência de &>.
Anexando Fluxos Combinados
Assim como com stdout, você pode anexar stdout e stderr combinados a um arquivo usando >> file 2>&1 ou &>> file.
-
Anexe mais saída e erros a combined_output.log.
find ~/project /root -name "line_count.txt" >> combined_output.log 2>&1
-
Visualize o combined_output.log atualizado.
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
/home/labex/project/line_count.txt
find: ‘/root’: Permission denied
A nova saída e os erros são anexados ao conteúdo existente.
Você agora aprendeu com sucesso como redirecionar o erro padrão e como combinar a saída padrão e o erro padrão em um único arquivo. Este conhecimento é essencial para tarefas robustas de scripting e administração de sistemas.