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 以下をあんまりいじりたくないので、brew で zsh をインストールし直す。
$ brew unlink zsh $ brew install --disable-etcdir zsh
これで /etc 以下の設定ファイルを無効にできる。
教訓
- shell の設定ファイルはよく理解して使いましょう...