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   # ?
PP.
fonte

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.

Chapeleiro Louco
fonte
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