você está aqui: Home  → Arquivo de Mensagens

Redirecionamentos - Parte 3 - Redirecionamento da Saída de Erros (StdErr)

Colaboração: Julio Cezar Neves

Data de Publicação: 03 de outubro de 2019

Um recadinho rápido, no dia 7 de outubro, às 23h59m, fecharemos as inscrições para o curso Programação Shell Linux, com o Prof. Julio Neves. Esta será a última turma deste ano, então se você quiser entrar 2020 com tudo, esta é a sua chance.

»» Clique aqui ««« para saber mais e ver os depoimentos de nossos alunos.


Redirecionamentos - Parte 3 - Redirecionamento da Saída de Erros (StdErr)

Como vimos, FD1>&- tranca a saída com o file descriptor FD1. Será que isso funciona com a saída de erros?

$ ls NaoExiste 2>&- || echo Esse arquivo não foi criado ainda
Esse arquivo não foi criado ainda

Funcionou, e é mais rápido que:

$ ls NaoExiste 2>/dev/null || echo Esse arquivo não foi criado ainda

Que é o que você vê em 99% dos scripts.

No entanto, trancar o redirecionamento da saída primária dá erro:

$ ls Existe >&- && echo Arquivo foi criado
ls: erro de gravação: Descritor de arquivo inválido
$ ls Existe 1>&- && echo Arquivo foi criado
ls: erro de gravação: Descritor de arquivo inválido

Isso ocorre porque o operador && tentou mandar um texto para uma saída trancada.

Para criar exemplos rápidos vou usar linhas de comandos dentro de parênteses, porque estes criam um subshell e desta forma podemos emular o que aconteceria se os dados estivessem em um script.

Para começar, quero mandar uma mensagem para a StdErr. Mas como faço isso?

$ (echo Certo; echo Erro) 2> x; echo Arquivo x = -$(cat x)-
Certo
Erro
Arquivo x = --

Não é assim que se faz, ambas as saídas foram para StdOut. Vamos então redirecionar a mensagem de erro para StdErr:

$ (echo Certo; echo Erro >&2) 2> x; echo Arquivo x = -$(cat x)-
Certo
Arquivo x = -Erro-

Essa é a forma correta - embora rara de se ver - de mandarmos uma mensagem para StdErr.



Veja a relação completa dos artigos de Julio Cezar Neves