stderr está sendo enviado para baixo do pipeline, mas eu não quero que

0

Eu tenho isso:

    echo "$some_command" | bash 2> >(prepend 'r2g-stderr:' 'red') | prepend 'r2g-stdout:' 'yellow';

O que estou tentando fazer:

r2g-stderr: this is some stderr
r2g-stderr: this is some more stderr
r2g-stderr: this is some mo mo stderr
r2g-stdout: this is some stdout
r2g-stdout: this more stdout

e, claro, o r2g-stderr / r2g-stdout terá cores diferentes.

o problema é que estou recebendo uma saída assim:

r2g-stdout: r2g-stderr: this is some stderr
r2g-stdout: r2g-stderr: this is some more stderr
r2g-stdout: r2g-stderr: this is some mo mo stderr
r2g-stdout: this is some stdout
r2g-stdout: this more stdout

Eu acho que é porque o stderr da substituição do processo está de alguma forma abrindo caminho para o segundo comando prepend, mas não consigo descobrir como.

    
por Alexander Mills 07.05.2018 / 10:07

1 resposta

1

Onde prepend imprime sua saída? Para stderr ou para stdout ? Eu acho que a substituição do processo em cmd 2> >(procsub) | ... herda o redirecionamento de stdout definido pelo pipe.

Você precisaria fazer algo assim para redirecionar explicitamente a saída do comando de substituição do processo para stderr novamente:

cmd 2> >(procsub >&2) | pipecmd

ou substitua o pipe por outra substituição de processo:

cmd 2> >(procsub) 1> >(pipecmd)

O último parece mais limpo para mim, mas neste caso toda a saída resultante vai para stdout (do ambiente externo), e pelo menos o meu Bash retorna ao prompt antes que as substituições do processo sejam concluídas, então a saída fica misturado com o prompt.

O primeiro deles funciona:

$ bash someoutput.sh  2> >(sed -e 's/^/ERR:/' >&2)  | sed -e 's/^/OUT:/'
ERR:error message
OUT:normal output

Mas lembre-se de que, após os redirecionamentos, a ordem original da saída de erro e a saída normal podem não permanecer no final. Meu script acima realmente imprimiu a string normal output primeiro, mas às vezes a linha de erro aparece primeiro, como acima.

    
por 07.05.2018 / 10:21