2012年4月3日火曜日

zshでnaveを使うと"no such option: rcfile"が出る

どうも、俺@仕事中です。
nodeのバージョン管理をnaveを使って優雅に使いこなそうとして

$ ./nave.sh use stable
とかカッコ付けてやると

$ Already installed: 0.6.14
using 0.6.14
/bin/zsh: no such option: rcfile
とか出て「マジでか!?」ってなる人へ。

nave use latest: zsh no such option rcfile - Linux LABS
にあるように実行ユーザのシェルをbashに変えちゃうという方法もありますが。

nave.shを見てみると
$ vim nave.sh

-------------------------------
408: "$SHELL" --rcfile "$NAVE_DIR/naverc"
〜(中略)〜
464: "$SHELL" --rcfile "$NAVE_DIR/naverc"
と2ヶ所rcfileオプションを使ってる場所があります。
そもそもrcfileオプションはbashで使えるオプションで、コマンドラインでシェルを使う場合に設定ファイルとして読み込むファイルを指定できるオプションです。
つまり上記のnave.shでは

 bash --rcfile ~/.nave/naverc
のように"~/.nave/naverc"を読み込んで対話型bashを使う、というようにプログラムされているのですが、
実行ユーザのシェルがbash以外だと$SHELLがzshなりtcshなりに展開されて、意図しない動きになっちゃう訳です。

僕が普段使うzshは--rcfileというオプションが使えません。
基本的にログイン時は

$ZDOTDIR/.zshenv $ZDOTDIR/.zprofile $ZDOTDIR/.zshrc $ZDOTDIR/.zlogin
これらのファイルが読み込まれるのですが、全部が全部ログイン時に読み込まれるわけではなく、詳しくは
zsh - watallica metallicus
を参照のこと。

今回は .zshrc に設定することにします。
# 以下の方法は正しい動作を保証するものではありません。
# とりあえず動くように設定していますので、安定性を重視する場合は実行ユーザのログインシェルをbashにしておき、配布されたソースプログラムは変更しない事をお勧めします。

という訳で、書き換えちゃいましょう。
$ vim nave.sh

-------------------------
# nave_use () 内
397: else
398:   hash -r
399:   NAVELVL=$lvl NAME="$version" ¥
400:     NAVEPATH="$bin" ¥
401:     NAVEVERSION="$version" ¥
402:     NAVENAME="$version" ¥
403:     npm_config_binroot="$bin" npm_config_root="$lib" ¥
404:     npm_config_manroot="$man" ¥
405:     npm_config_prefix="$prefix" ¥
406:     NODE_PATH="$lib" ¥
407:     NAVE_LOGIN="1" ¥
408:    "$SHELL"
409: #"$SHELL" --rcfile "$NAVE_DIR/naverc"

コレでよしと。

次にnave用のzshが起動されたときの処理を.zshrcに書きます。
$ vim ~/.zshrc
------------------------------------
# 追加
if [ "$NAVE_LOGIN" = "1" ]; then
    export PATH=$NAVEPATH:$PATH
fi


これで準備完了です。
あとは優雅に

$ nave.sh use stable
と打つべし。


以上でぇぇぇえぇぇす。





0 件のコメント: