わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

zsh+rvmでエラーは「setopt no_unset」のせい

Rubyの最新版スナップショットのバージョンが「2.0.0dev」になっています.1.9.3で動作確認したいときも出てきそうなので,複数のバージョンを保持できる,rvmを使うことにしました.
1.9.3と1.8.7を入れましたが,インストール作業にあたり,以下の情報を活用しました.

さて…普段はcygwin + zshの環境でコマンドを実行していますが,エラーが出るため,rvmおよびそのもとでのrubyのインストールは,いったんbashに切り替えて行いました.しかし今後,いつもbashrubyを実行というのは,やってられません.
まずは確認.

$ uname -a
CYGWIN_NT-6.1-WOW64 duo 1.7.8(0.236/5/3) 2011-03-01 09:36 i686 Cygwin

$ echo $SHELL
zsh

$ zsh --version
zsh 4.3.11 (i686-pc-cygwin)

$ [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"
/home/takehikom/.rvm/scripts/base:41: rvm_base_except: parameter not set
/home/takehikom/.rvm/scripts/rvm:110: command not found: __rvm_setup
/home/takehikom/.rvm/scripts/rvm:129: command not found: __rvm_conditionally_add_bin_path
/home/takehikom/.rvm/scripts/rvm:154: command not found: __rvm_teardown

エラーの起こっているファイルを見に行きます.~/.rvm/scripts/rvm の41行目は次のとおり.

case " $rvm_base_except " in

この行をいじったりしてみましたが,最終的に元に戻しました.エラーが起こる原因は,このファイルよりもむしろ,~/.zshrcで

setopt no_unset              # 未定義変数の使用禁止

としていることでした.検索をかけると,http://www.dna.bio.keio.ac.jp/~yuji/zsh/zshrc.txtをコピーしていたっぽいです.
ということで,

#setopt no_unset              # 未定義変数の使用禁止

とすれば解決するのですが,せっかくなので別の方法をとってみます.「setopt no_unset」はそのままとして,~/.zshrcの後方に,以下のように書きます.

# RVM
if [ -s ~/.rvm/scripts/rvm ]
then
    if setopt | grep -q nounset
    then
        setopt unset
        source ~/.rvm/scripts/rvm
        function rvmm() {
            setopt unset
            rvm $*
            setopt no_unset
        }
        setopt no_unset
    else
        source ~/.rvm/scripts/rvm
        alias rvmm=rvm
    fi
fi
# [[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"

「setopt no_unset」をしているときは,rvm関連コマンドを実行するときだけ一時的に「setopt unset」とし,実行を終えてプロンプトを出す前に「setopt no_unset」にします.「setopt no_unset」としていないときは,普通のコマンドです.
なのですが,rvmのコマンド実行時には,「rvm」ではなく「rvmm」を使用することにします.もし「setopt no_unset」の指定をしていて,プロンプトでrvmコマンドを実行すると,

$ rvm list known
/home/takehikom/.rvm/scripts/base:41: rvm_base_except: parameter not set
(略)

と出るのですぐわかります.*1
rvmmの動作確認をしておきましょう.

$ rvmm use 1.9.3
Using /home/takehikom/.rvm/gems/ruby-1.9.3-p0

$ which ruby irb gem
/home/takehikom/.rvm/rubies/ruby-1.9.3-p0/bin/ruby
/home/takehikom/.rvm/rubies/ruby-1.9.3-p0/bin/irb
gem () {
        local result
        command gem "$@"
        result="$?"
        hash -r
        return $result
}

gemがfunction化されていますが,これは,~/.rvm/scripts/override_gemに記載があります.~/.rvm/scripts/rvmを読み込んだ際に,上書きするようです.


同日追記:上記設定をして,zshを起動すると,cdコマンド実行時に

__rvm_after_cd:3: rvm_scripts_path: parameter not set

と出ます.~/.rvm/scripts/cdの先頭コメントに従い,「rvm_project_rvmrc=0」を~/.rvmrcに記述すれば回避できます.しかしこの種のトラブルは,もっとありそうです.

*1:「rvm なになに」とやってしまったら,あわてず騒がず,終了するか待つかして,プロンプトになったら,「^m^mm」を実行します.