読むべき人
- .zshrcに
export PATH=
を全部書いてる人 - .zshrcの中で
eval (plenv init -)
をやってる人 - .plenv/shimsを明示的に$PATHに追加してない人
どれか当てはまったらいつかハマるかも.
- process fork してperl 呼ぶと system perl が呼ばれちゃう人
の助けになるかも.
- 「vim quickrunでplenv(rbenv)のperl(ruby)が呼ばれてない!」
って人も助かるかも.
GNU parallelを使って並列処理する機会がありハマったのでめもしておきます.
問題
zshの設定ファイルには.zshenv, .zprofile, .zshrc等がありますが,それぞれ読まれ方が違います.
参考:http://news.mynavi.jp/column/zsh/001/index.html
zsh hogehoge.sh
とかやった場合は.zshenvしか読まれないようです.
ここで気になるのはPATHがどうなるかですが,.zshenvに書いてなければ当然exportされません.
通したはずのPATHが通ってない!と困ることになります.
また perl の error では @INC に module への path がないよ!みたいな感じになります.
あと plenv を init する際に plenv の perl の path が export されるので,.zshenv に plenv init を書いてる人は問題が起きません.
sub CMD_init {
home_init();
print <<"...";
export PATH="$PLENV_HOME/shims:\${PATH}"
...
}
ただし.zshenv が読まれるたびに plenv init するのでオーバーヘッドが気になります.
oh-my-zsh 使ってると oh-my-zsh バージョンチェックのために zsh コマンドを使っていてそのタイミングでも plenv init するので余計気になります.
(そもそもoh-my-zshをマニュアル通りにインストールして使おうとすると .zshrc 読まないと .zshenv の内容読めないような気がするんだけどどうなんだろう…)
解決
- zsh の設定ファイルがそれぞれいつ読まれるのか把握する
- .plenv/shims も $PATH に入れとく
- export PATH を .zshenv に書く
- plenv init は .zshrc に書く
いろいろ試した結果これがいいかなあと思います.
2013-07-04追記
tmux使ってて新しいタブ開くと.zshenvが二回読まれててなんだろなとおもってたんですが,.tmux.confで
set-option -g default-command "reattach-to-user-namespace -l zsh"
としてzsh起動してました.
謎が解けた.
2013-07-08追記
まったく意識せずに書いてましたが私の環境では plenv を homebrew で入れてます.
なので
`brew --prefix`/bin
に plenv 自体のシンボリックリンクがある状態です.
git clone git://github.com/tokuhirom/plenv.git ~/.plenv
した場合には,.zshenv か .zshrc の plenv init する前に
export PATH=$HOME/.plenv/bin:$PATH
を書いとかないと login 時に plenv 自体が見つからずに init できませんので注意が必要です.