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