最近 Ubuntu から Mac に環境移行して,Ubuntuとかirb上では当然使える gets
が何故かMac のターミナル上でだけ使えないということがありました.
これに対して,「Ruby Mac 標準入力 使えない」とか 「Mac Ruby gets doesn't work」とか IQ低そうなキーワードでググってたのですが,まったくヒットせず,それもそのはず,Mac は全く関係なくてvimrcというか改行コードのせいなのでした.
こんな事態になる場合は滅多にないと思いますが,同じような症状でググって途方に暮れる人がいないとも限らないので一応書き留めておきます.
状況
Ruby で標準入力を一行受け取って,その文字を出力するコードは以下のようになります.
test.rb
str=gets.chompputsstr
なので,このプログラムを実行した時の結果は,以下になることが期待されます.
$ 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()prints
教訓
.vimrc にわけも分からずごちゃごちゃ書くのはやめよう