Eu sei como redirecionar para um arquivo e usar tee; em um nível básico. então
$ alias outanderr='bash -c "echo stdout >&1; echo stderr >&2"'
# A fake "application" displaying both output and error messages.
$ outanderr 1>file # redirect stdout to a file, display stderr
stderr
$ outanderr 2>file # redirect stderr to a file, display stdout
stdout
$ outanderr 1>file 2>&1 # redirect both to a file, display nothing
$ outanderr | tee file; echo "-- file contents --" && cat file
# redirect stdout to a file, display both (note: order is messed up)
stderr
stdout
-- file contents --
stdout
$ outanderr 2>&1 | tee file; echo "-- file contents --" && cat file
# redirect both to a file, display both
stdout
stderr
-- file contents --
stdout
stderr
A questão é: o que escrever no lugar dos pontos de interrogação para obter a saída abaixo:
$ outanderr ???; echo "-- file contents --" && cat file
# redirect both to a file, display stderr
stderr
-- file contents --
stdout
stderr
Constaints:
- Assumindo festança.
- A ordem deve ser mantida no arquivo.
- O conteúdo do stderr é exibido em tempo real, linha por linha, ou seja, sem buffer.
- Arquivos de script separados podem ser usados.
- Magia pode ser necessária.
bash
files
io-redirection
TWiStErRob
fonte
fonte
outanderr
programa você tem?outanderr
está apenas um alias que imprime uma linha para stdout e outra para stderr. A idéia (se possível) é criar uma solução genérica que possa funcionar com qualquer programa, sem modificá-los.Respostas:
Para testes fáceis:
Editar 1:
Isso funciona gravando stdout (somente) no arquivo, tornando sterr stdout para que ele atravesse o pipe e fazendo com que tee grave sua saída no mesmo arquivo.
As duas gravações devem ser feitas no modo de acréscimo (em
>>
vez de>
), caso contrário, ambas substituiriam a saída uma da outra.Como o pipe é um buffer, não há garantia de que a saída apareça no arquivo na ordem correta. Isso nem mudaria se um aplicativo estivesse conectado aos dois descritores de arquivo (dois pipes). Por ordem garantida, ambas as saídas teriam que passar pelo mesmo canal e ser marcadas respectivamente. Ou você precisaria de algumas coisas realmente chiques:
/dev/null
. As saídas do aplicativo seriam separadas executando-ostrace -f -s 32000 -e trace=write
. Você teria que reverter a fuga nesse caso. Escusado será dizer que o aplicativo não roda mais rápido por ser rastreado.fonte
stdout
estderr
paratee
, ou estou perdendo alguma coisa? Eu acho que o requisito do OP étee
stderr
apenas.