Pastalablog in はてな

時代はブログ! 日記もあるよ→http://pastak-diary.hatenadiary.com

tmux + zsh 環境下での PATH の話

全然ZSHの仕組みを知らなかったとかそういう話です。

そもそもずっと、phpenvが上手く使えなくておかしいと思ってた。

いつも、デフォルトのphpが起動するので、毎回$ ~/.phpenv/shims/php hoge.phpとかってしてた。これ絶対おかしくて治したいと思ってた。他にもhomebrew経由で入れたVimじゃなくてデフォルトのVimが立ち上がるとかでずっとPATH周りが怪しいなと思ってたけど手を出せずにいた。

最近、vim-gitgutterっていうVimプラグインVim 7.3 Vim 7.3.105以降を要求してくるようになったので、Vimのバージョンを上げたくなったから重い腰を上げて戦うことにした。

まず、PATHが異常な感じで、zshrcに書いてないPATHが書いてあったり、PATHが重複したりしていて絶対これの所為だと思った。

Homebrewのインストール方法を書いたサイトとかには

export PATH=/usr/local/bin:/usr/bin

って書けば良いって書いてあるから、そうやって書いてるのに、/usr/bin$PATHの中では先に居てそっちが優先されるみたいなことになってた。

頑張ってググってたら、中身自体は今回のことと直接関係はなかったんだけど、こういうページに遭遇した。

ここの解決策のとこに載ってるpostに/etc/pathsがどうこうみたいなことが書いてあって、これっぽいなぁと思ってもう少し調べた。

どうやら、/etc/pathsに書いてあるのは連結されてシェル起動時に環境変数$PATHに読み込まれるっぽいことがわかったので、/etc/pathsを開くと、確かに色々それっぽいディレクトリのパスが書かれていたので、順番を入れ替えて、/usr/local/binを先頭にした。

これでどうにかなるだろうと思ったけど、まだ解決しなくて、おかしいままだった。homebrewで入れたVimとかは立ち上がるようになったけど、phpenvで入れたPHPとかは相変わらずダメだった。

でも、ふと、そういやシェルの起動はtmux上でやってるから、tmuxが何かしてるのかもしれないと思った。

試しにiTerm2で新規タブを作ってシェルを立ち上げると意図通りに設定できていた。

これはもう絶対にtmuxが絡んでると確信したので、そういう感じでググる。そしたら、それっぽい情報が見つかった。インターネット便利。

解決方法はこのサイトに書いてある通り*1 で、/etc/zshenv

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

と書き直した。

原因はこのページの下部の説明のとこに書かれてました。

PATHを設定する際、重複したパスが存在すると"左"に書かれているパスが優先して設定され、"右"にあるパスは削除されます。

/etc/zshenvの中で呼んでるpath_helperっていうのが環境変数を設定してくれているようで、こいつがサブシェル起動時に、親シェルの環境変数を引き継いで設定をして、その後に~/.zshrcの中身が読まれるので、上手くいかないという話だった。

これで無事、phpenvで入れたPHPが使えるようになった。

ついでに環境変数周りについても少し詳しくなれた。

めでたしめでたし。

*1: 元サイトには.zshrcを弄れと書いてあったけど、読み込み順的に/etc/zshenvを書き直した方が良さそうな気がしたから、そうした。