bash: redireciona o stderr para o arquivo e stdout + stderr para a tela

3

Eu gostaria de salvar o fluxo stderr de um comando em um arquivo de log, mas também quero exibir toda a saída (stdout + stderr) na tela. Como posso fazer isso?

Eu só encontrei a solução para exibir stdout + stderr para o console e redirecionar os dois fluxos para um arquivo também:

 foo | tee output.file

( link )

Mas eu só quero redirecionar o stderr para o arquivo de log.

    
por linuxguy 28.12.2016 / 07:19

1 resposta

4

Com um bash recente, você pode usar a substituição de processos.

foo 2> >(tee stderr.txt)

Isto apenas envia stderr para um programa rodando tee.

Mais portably

exec 3>&1 
foo 2>&1 >&3 | tee stderr.txt

Isso faz com que o descritor de arquivos 3 seja uma cópia do stdout atual (ou seja, a tela), depois configura o canal e executa foo 2>&1 >&3 . Isso envia o stderr de foo para o mesmo local que o stdout atual, que é o pipe, e envia o stdout para fd 3, a saída original. O pipe alimenta o stderr original de foo para tee, que salva em um arquivo e o envia para a tela.

    
por 28.12.2016 / 07:53