Você precisará manter a saída stderr em algum lugar para poder exibi-la no final.
Um arquivo vem à mente:
fff 2> file; cat file >&2
Ou memória (aqui usando sponge
de moreutils
):
{ fff 2>&1 >&3 3>&- | sponge >&2 3>&-; } 3>&1
-
{...} 3>&1
: dentro de{...}
descritor de arquivo (fd) 3 pontos para o mesmo recurso que o stdout original (para que possamos usá-lo para restaurar o stdout parafff
). -
fff <redirs> | sponge <redirs>
,fff
esponge
foram executados simultaneamente (com<redirs>
aplicado independentemente) com o stdout defff
indo para um canal, e a porcentagem desponge
sendo a outra extremidade do canal. -
2>&1
: fd 2 defff
(stderr) aponta para a mesma coisa que para 1: o canal neste ponto, portanto, o errofff
vai parasponge
através desse canal. -
>&3
: agora o stdout aponta para o stdout original (redireciona de volta para o que era) -
3>&-
: fechamos fd 2, o qualfff
não precisa -
sponge
acumula sua entrada e apenas a exibe (em seu stdout que foi redirecionado com>&2
para o mesmo recurso que stderr) depois de ter detectado eof em seu stdin (assumido como sendo quandofff
termina e já escreveu toda a sua saída em sua stdout).
Se sponge
não estiver instalado, você poderá substituí-lo por perl -0777 -pe ''
. Com -pe ''
, perl
lê um registro por vez de sua entrada e grava no stdout. -0777
é o modo slurp no qual o registro (apenas um nesse caso) é a entrada inteira.