デフォルトシェルをfishに変えるな
デフォルトシェルをbashからfishに変えてからrbenvの設定が通らなくなった
まず、bashからfishにデフォルトシェルを変えた。bashを使ってて特に不満はなかったけど、コマンドの補完機能がないのが使いにくかった。fishを使うと補完機能が素晴らしすぎ&いろいろと捗るものでした。
(z でのディレクトリ移動最高。)
ここで安易にデフォルトシェルをfishに変えてしまったんですが、後々後悔することに。
rbenvでつまづく
違和感に気づいたのは、rubyの環境を整えようとrbenvを使用してrubyをインストールしたとき。
rbenv で ruby の環境を整えられず
rbenvでインストールしたのに設定が反映されない。
$ ~> rbenv versions
system
2.2.2
* 2.2.3 (set by /Users/nitawaki/.rbenv/version)
`ruby 2.2.3p173`が返ってくるはずが返ってこない。
$ ~> ruby -v
ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin16]
以下の内容を.bash_profileに記載しても適用されない。
eval "$(rbenv init -)"
なぜか
fishに切り替えた後は特に問題がないように見えて、実はbashとfishでは構文が違うので、.bash_profileに記載していた内容が全部エラーになってしまった。
bash上で.bash_profileのエラーは表示されるが、fishのシェル上だとコマンドライン上ではエラーが表示されず、shell初心者には検知できない状態に。
そこで
デフォルトシェルをfishからbashに戻し、.bashrcに
exec fish
を追記することで、.bash_profile, .bashrcの設定読み込み後にfishを起動する流れに変更してみた。
だがしかし
まだrbenvでrubyのバージョンが切り替わらない。
このときの.bash_profileと.bashrcの内容を見てみる
.bash_profile
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fiexport PATH=$PATH:$(go env GOPATH)/bin
export GOPATH=$(go env GOPATH)# Setting PATH for Python 3.4
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.4/bin:${PATH}"
export PATHeval "$(rbenv init -)"
.bashrc
# nodebrew
export PATH=$PATH:$HOME/.nodebrew/current/bin
# direnv
eval "$(direnv hook bash)"# EB CLI
export PATH=$PATH:exec fish
はい。ごちゃごちゃと関係のない記載がありますが、
このミスに気づくのにfishインストールしてから3週間かかりました。
.bash_profileの1~3行目で「.bashrcがあれば読み込む」という処理があります。 コレにより、2行目で.bashrcを読み込みに行き、fishが起動されてしまうことに。
.bash_profileの末尾に追加された eval “$(rbenv init -)” は読み込まれませんでした。
修正後
以下の内容にdo
.bash_profile
# (その他設定など)# 1.Setting rbenv
eval "$(rbenv init -)"# 2.bashrc がある場合は bashrc を読み込む
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi# 3.bash_profile の読み込み完了後に fish の起動.
exec fish
.bashrc
# (.bashrc設定)
ruby -vも想定値に。
$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-darwin16]$ which ruby
/Users/nitawaki/.rbenv/shims/ruby
$ which gem
/Users/nitawaki/.rbenv/shims/gem
which rubyも usr/bin/ruby から rbenvのディレクトリを参照するようになった・・・。一安心
教訓
- 安易にデフォルトシェルは切り替えるな
思いもよらないことが起こる - 意味がわからないままdotfileはいじるな
アルゴリズムがわからないままプログラムするのと同じことになる