Capturando STDERR e STDOUT para arquivar usando tee


15

Não estou claro qual é a melhor ordem para capturar ambos STDERRe STDOUTpara o mesmo arquivo usando tee. Eu sei que se eu quiser canalizar para um arquivo, tenho que mapear o tratamento de arquivos após o redirecionamento, ou seja,

find . >/tmp/output.txt 2>&1

Isso instrui o shell para enviar STDOUTpara /tmp/output.txte, em seguida, enviar STDERRpara STDOUT(que agora está enviando a /tmp/output.txt).

Tentar executar o 2>&1antes de redirecionar o arquivo não terá o efeito desejado.

No entanto, quando eu quero canalizar usando teedeveria ser:

find . |tee /tmp/output.txt 2>&1   # or
find . 2>&1 |tee /tmp/output.txt   # ?

Respostas:


18

O último; ele garante que STDOUT e STDERR do comando original vão para o mesmo fd e os alimentam juntos em tee. No primeiro caso, é o STDERR do comando tee que você juntaria ao STDOUT.


5
Curiosamente, a página de manual do bash diz: "Se |&for usado, o erro padrão do comando1 será conectado à entrada padrão do comando2 através do canal; é uma abreviação de 2>&1 |. Esse redirecionamento implícito do erro padrão é realizado após qualquer redirecionamento especificado pelo comando".
PP.

Eu tive que criar um pequeno programa C que grava tanto no stderre stdoutpara entender esse problema. Os operadores de redirecionamento >e tee |diferem ao tentar capturar os dois fluxos de saída. Para redirecionamento eu tive que ./testapp > /tmp/out.log 2>&1. Considerando que para tee eu tinha que ./testapp 2>&1 | tee /tmp/out.log.
typelogic

@daixtr, pelo que vale a pena, |é normalmente chamado de operador de tubo. teerefere-se apenas ao programa específico que está sendo chamado na extremidade do canal.
MadHatter
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.