Nenhum dos shells usuais (mesmo zsh) permite que os pipes não sejam stdout stdin. Mas todas as shells no estilo Bourne suportam a reatribuição de descritores de arquivos (como em 1>&2
). Assim, você pode desviar temporariamente o stdout para o fd 3 e o stderr para o stdout, e depois colocar o fd 3 de volta no stdout.
Se stuff
produzir alguma saída no stdout e alguma saída no stderr e você desejar aplicar filter
na saída de erro deixando a saída padrão intacta, será possível usar { stuff 2>&1 1>&3 | filter 1>&2; } 3>&1
.
$ stuff () {
echo standard output
echo more output
echo standard error 1>&2
echo more error 1>&2
}
$ filter () {
grep a
}
$ { stuff 2>&1 1>&3 | filter 1>&2; } 3>&1
standard output
more output
standard error