Muitos (a maioria?) programas e praticamente todos os programas C ou C ++, 'totalmente' buffer stdout quando é um arquivo de pipe ou disco ou em geral não isattty() e qualquer saída ainda no buffer e não liberado para o sistema operacional quando você mata, ele é perdido. Normalmente, os programas NÃO fazem esse buffer para stderr, e é por isso que isso funciona.
No geral, use stdbuf -oL program ... ou possivelmente -o0 . Alguns programas têm suas próprias opções privadas, por ex. O GNU sed tem -u/--unbuffered .
Como alternativa, use algo que execute o programa em um arquivo e, assim, desative o buffer, incluindo script , screen , expect ou sua forma simplificada unbuffer ou ssh -t .
Para obter mais detalhes e opções, consulte Desativar o buffer no tubo