Help us understand the problem. What is going on with this article?

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

More than 5 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 にわけも分からずごちゃごちゃ書くのはやめよう

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away