zsh, plenv(rbenv), parallel

読むべき人
  • .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 できませんので注意が必要です.

2013-07-31追記

Qiitaにもあげときました
http://qiita.com/rg_gs/items/5795fa777cac90d1359b