Это происходит из-за буферизации строк по сравнению с буферизацией блоков.Вы можете контролировать тип буферизации, вы можете очищать их в том месте, где вы хотите синхронизировать их вывод, или вы можете просто ждать выхода, после чего все сбрасывается.Если вы не форсируете его тем или иным образом, буферизация зависит от того, является ли вывод tty-типом 1 дескриптором файла, поэтому перенаправление в канал изменяет режим.
В частности:
true false
------------- --------------
$stdout.tty? line-buffered block-buffered
$stderr.tty? line-buffered line-buffered
Их можно настроить одинаково с помощью:
$stdout.sync = $stderr.sync = true # or false, of course
Мой тестовый пример:
$stdout.sync = $stderr.sync = true
$stdout.puts 'stdout a'
sleep 2
$stdout.puts 'stdout b'
sleep 2
$stderr.puts 'stderr a'
sleep 2
$stderr.puts 'stderr b'
sleep 2
1.Смотрите ttyname (3).