Git for WindowsにおけるRubyのputsの挙動

Git for Windows (Git bash)でrubyのプログラムを走らせているときプログラムが停止しているような挙動に遭遇した。デバッグしてみると、停止している箇所はユーザからの入力を受け付ける部分であったが、入力待ちで停止しているのではなく、putsでユーザに入力を促すメッセージを表示している部分であった。putsデバッグメッセージを入れると表示せずにそこで停止してしまうことに気づいて、pprintを代用してみたところ、pだと正常にメッセージ表示される。putsの後にpを持ってくると、putsも表示される。これはどうもputsの場合は非同期にバッファに蓄えられており、pの場合はバッファを含めて同期的に全て標準出力に出力される(flushされる)、という挙動になっているらしい。そのため、$stdout.sync = trueをプログラムの先頭に書いておくことで、putsでも正常にメッセージ表示されるようになった。

なお、Cygwinコマンドプロンプトから実行するとこのようなputsの問題は起こらなかった。

MinGWでどうなるかは試していませんが、こういった症状がある記事が見当たらなかったし、なかなかおもしろい挙動だったのでメモ。まあ、Git bashではgitコマンドだけを使うことにしておいた方が良い、ということなのかも。

環境は、Windows 7 32bit / Ruby 2.2 / Git for windows

git-for-windows.github.io