Posted at

Mac で Ruby の標準入力が受け取れないと思ったらvimrcに要らんもん書いてたせいだった

More than 3 years have passed since last update.

最近 Ubuntu から Mac に環境移行して,Ubuntuとかirb上では当然使える gets が何故かMac のターミナル上でだけ使えないということがありました.

これに対して,「Ruby Mac 標準入力 使えない」 とか 「Mac Ruby gets doesn't work」 とか IQ低そうなキーワード でググってたのですが,まったくヒットせず,それもそのはず,Mac は全く関係なくてvimrcというか改行コードのせいなのでした.

こんな事態になる場合は滅多にないと思いますが,同じような症状でググって途方に暮れる人がいないとも限らないので一応書き留めておきます.


状況

Ruby で標準入力を一行受け取って,その文字を出力するコードは以下のようになります.


test.rb

str = gets.chomp

puts str

なので,このプログラムを実行した時の結果は,以下になることが期待されます.

$ ruby test.rb                                                                                                                                 

hogehoge
hogehoge
$

ただ,自分の環境では,getsの内容がstrに代入されず,以下のようになっていました.

$ ruby test.rb                                                                                                                                 

hogehoge

$


原因と解決策

結論からいうと,ソースコードの改行コードが ¥r になっていたのが原因で,¥n に置換したら解決しました.

システム
改行コード

Unix
LF(¥n)

Mac (OS X以前)
CR(¥r)

Windows
CR+LF(¥r¥n)

なんでそんなことになってたかというと,vimrc に昔わけも分からず書いた行が混じっていたからでした.

" set fileformats=mac,unix,dos

コメントアウトして解決.


なぜ Ruby のソースコードの改行コードの違いで問題が起きるのか

わからないのでもし分かる方いらっしゃったら教えて下さい.

以下のような Python のコードは,改行コードが ¥r であっても,ターミナル上で正常に動きます.


test.py

-*- coding: utf-8 -*-

s = raw_input()
print s


教訓

.vimrc にわけも分からずごちゃごちゃ書くのはやめよう