LoginSignup
16
15

More than 5 years have passed since last update.

emacs上でrbenvが使えなくなる件について

Last updated at Posted at 2014-05-13

発端

ある日突然、rspec-modeのテスト実行が失敗するようになった。
ログによるとシステムのrubyを使おうとしており、rbenvが無視されている。
rbenv.elはもちろん使っているし、exec-pathに~/.rbenv/shimsを入れるようにしてもダメ。exec-path-from-shellも使ってみたけどダメ。

犯人はpath_helper

弱り果ててrpsec-modeに直接デバッグコードを埋めて調べてみると、PATHの先頭に/usr/bin,/binなどが入っていて、rbenvのrubyよりもシステムのruby(/usr/bin/ruby)が優先されていた。
もちろんrbenvのパスはrbenv.elが先頭に追加しているはずなので、原因がよく分からなかったのだが、こちらなどを見て判明。
/etc/zshenvに以下のコード

/etc/zshenv
# system-wide environment settings for zsh(1)
if [ -x /usr/libexec/path_helper ]; then
        eval `/usr/libexec/path_helper -s`
fi

が書かれていて、書いてある通りにpath_helperを実行すると

$ /usr/libexec/path_helper -s
PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin(略)"

のように標準のpathが先頭について返ってくる。このpathは/etc/pathsに

/etc/paths
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin

のように記述されている。

回避策

さて、zshの設定ファイルが読み込まれる順番は以下の通り。

  1. /etc/zshenv
  2. ~/.zshenv
  3. /etc/zprofile (ログインシェルの場合)
  4. ~/.zprofile (ログインシェルの場合)
  5. /etc/zshrc (対話的シェルの場合)
  6. ~/.zshrc (対話的シェルの場合)
  7. /etc/zlogin (ログインシェルの場合)
  8. ~/.zlogin (ログインシェルの場合)

対話シェルではないので.zhsrcは使われず、/etc/zshenvだけが読み込まれた結果、先頭に/usr/binが追加されてしまっていたわけ。
というわけで回避策は

~/.zshenvにrbenvの設定を書く

でした。
rbenvの設定はいつも通り

.zshenv
export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init - zsh)"

でOK。

補足

なお、.zshrcにもrbenvの設定が書いてある場合はPATHが重複してしまうので、気になる人は調整しましょう。
あるいはpath_helperを消す、/etc/zshenvをzprofileにリネームするなどの方法もあるけれど、なるべくシステムのファイルに手を加えない方が無難と思われます。(OSアップデートの時に戻ってしまったりするしね)

おまけ

なぜ突然この問題が表面化したのかは結局分からないまま。
.emacsをどこかいじった結果だと思われるが・・・

16
15
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
15