RVMを使ったスクリプト
RVMの仕組み上、RVMはコマンドラインからだけでなく、スクリプトにも適しています。RVMのコマンドラインインターフェースを使用してRubyやgemsetを切り替えるスクリプトを作成する場合は、通常の使用とは重要な違いがあることに注意する必要があります。
下記のバイナリモードと関数モードを読んで理解してください。
バイナリモード vs 関数モード
RVMは2つの異なるモードで実行できます。デフォルトでは、rvmバイナリがパスに存在する場合、または絶対パスで使用されている場合、RVMはバイナリとして実行されます。これは、rvmがほとんどの操作(Rubyのインストール、設定操作の呼び出しなど)を実行できることを意味しますが、特定の操作(現在のRubyの切り替えなど)は、操作している環境を変更できないため失敗します。
RVMがシェル関数として使用されている場合(シェルプロファイルファイルまたはスクリプトの場合、scripts/rvmファイルをsourceすることで)、実行されている環境を操作する能力を獲得します。具体的には、rvm useおよびrvm gemset useが期待どおりに動作し、GEM_HOME、PATH、および通常の操作に使用されるその他の環境変数を切り替えます。
スクリプト
RVMを実行できるモードは2つあるため、最初のオプションはバイナリとして実行し、rvm doを使用して指定された環境内でコマンドを1回実行することです。
たとえば、任意の環境でgemsetを作成するには
rvm 1.8.7-p334 do rvm gemset create my_gemset
2番目のオプション(おそらく必要なのはこれです)は、インタラクティブなログインシェルのプロファイルに入れるのと同じソース行を追加することです。
たとえば、ユーザーがインストールしたRVMの場合
\# Load RVM into a shell session *as a function* if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then \# First try to load from a user install source "$HOME/.rvm/scripts/rvm" elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then \# Then try to load from a root install source "/usr/local/rvm/scripts/rvm" else printf "ERROR: An RVM installation was not found.\n" fi
上記のコードがbashまたはzshスクリプトに現れると、スクリプトの残りの部分で環境に影響を与える通常のrvmコマンドを使用できるようになります。
rvmがバイナリではなくシェル関数として適切にロードされているかどうかを確認したい場合は、次の行をスクリプトに挿入できます。
type rvm | head -1
上記行が「rvm is a function」と出力する場合は、すべてが正常です。「rvm is hashed」、「rvm is $rvm_path/bin/rvm」、または「not found」と出力される場合は、スクリプト内でバイナリとして実行されているか、まったく実行されておらず、期待どおりにスクリプトの環境を制御できません。
スクリプトを作成していて、スクリプト内でRubyが「正しく切り替えられていない」場合に遭遇した場合は、rvm ()関数がシェルにロードされておらず、代わりにバイナリになっています。
参考資料
詳細については、このgistを参照してください。