Como redirecionar stderr e stdout para arquivos diferentes e também exibir no terminal?

28

Eu quero ver a saída de um comando no terminal como se não houvesse redirecionamento. Além disso, stderr precisa ser redirecionado para err.log e stdout precisa ser redirecionado para stdout.log.

Seria bom ter também a cópia exata do que é mostrado no terminal, ou seja, os erros são impressos como e quando ocorrem, em um arquivo separado: stdouterr.log.

    
por balki 25.01.2011 / 13:59

4 respostas

37

Use o comando tee da seguinte forma:

(cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log

3>&1 1>&2 2>&3 é como você troca stderr e stdout, porque tee só aceita stdout.

Dê uma olhada no comando Unix tee para redirecionamentos mais avançados usando tee .

    
por 25.01.2011 / 14:39
5

Eu acho que o registro de stdout e stderr em dois arquivos diferentes é uma ideia esplêndida. Isso não torna os logs assíncronos? Então eu tentei o seguinte:

  • stdout para "stdout.log" (como sugerido pelo dogbane)
  • stderror para "stderr.log" (como sugerido pelo dogbane)
  • todas as saídas para "all.log" e
  • ainda será capaz de ver a saída no visor (em um terminal separado!)

((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log

em outro terminal

tail -f --sleep-interval=2 all.log
    
por 06.11.2012 / 08:47
2

@dogbane, obrigado.
Eu encontrei uma outra maneira também que salva ambos os fluxos aproximadamente na ordem em que seriam impressos sem redirecionamento.

command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog

Mas isso funciona apenas com os shells que suportam a substituição do processo.

    
por 28.01.2011 / 06:37
-2

tente isto:

command 2>&1 | tee bothLog
    
por 01.11.2012 / 10:28