OSX + screen + rbenv でハマった話

osx で rbenv を使っているのだが、screen と併用すると screen から起動した shell で正しく rbenv が動かなかったので対応メモ。

設定ファイルを正しく

rbenv を利用するには ~/.zprofile, ~/.bashprofile などに

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

と書く必要がある。

各種設定ファイルが呼び出される順番は
https://github.com/sstephenson/rbenv/wiki/Unix-shell-initialization
に詳しい。
(PATHの値が変わらなければ)一度呼び出せば良い物なので、zshrc, zshenv などに書く必要はない。

screen

screen から shell を起動した時は、設定ファイルのうち

  • ~/.zshenv
  • ~/.zshrc

は呼び出すが、~/.zprofile は呼び出さない。

http://masutaka.net/chalow/2012-11-19-1.html

に詳しい。呼び出すようにもできる。(login-mode で shell を起動できる)
zprofile は呼び出さないのだが、環境変数 PATH は screen から開いた shell に引き継がれる。
なので、改めて zshenv/zshrc で rbenv のための PATH が設定されなくてもきちんと動く。

/etc/paths の罠

というわけで、~/.zprofile に設定を書けば上手く動くはずなのに、screen から起動した shell では環境変数 PATH の順序がおかしい。これでしばらくハマったのだが、実は /etc/zshenv に

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

と書いてあって、これが PATH の順序をおかしくしていた。path_helper は /etc/paths に書いてある値をPATHの先頭にもってくる。

/etc/paths とか /etc/zshenv を書き換えても良いのだけれど、/etc 以下をあんまりいじりたくないので、brewzsh をインストールし直す。

 $ brew unlink zsh
 $ brew install --disable-etcdir zsh

これで /etc 以下の設定ファイルを無効にできる。

教訓

  • shell の設定ファイルはよく理解して使いましょう...