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>,fffespongeforam executados simultaneamente (com<redirs>aplicado independentemente) com o stdout defffindo para um canal, e a porcentagem despongesendo 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 errofffvai paraspongeatravés desse canal. -
>&3: agora o stdout aponta para o stdout original (redireciona de volta para o que era) -
3>&-: fechamos fd 2, o qualfffnão precisa -
spongeacumula sua entrada e apenas a exibe (em seu stdout que foi redirecionado com>&2para o mesmo recurso que stderr) depois de ter detectado eof em seu stdin (assumido como sendo quandoffftermina 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.