バッファリングの問題だな。

eshell で標準出力に出力されるタイミングが遅い問題について - gan2 の Ruby 勉強日記

alias :_puts :puts
def puts(*args)
  _puts *args
  $stdout.flush
end

バッファリングの問題のようだから、再定義しなくても「$stdout.sync = true」でよくないかな?しかも↑だとputs以外のprintや「<<」やwriteに対応していないし。