2013-12-15 63 views
0

當我在ruby和irb中運行%x{rvm use @myapp}時出現錯誤。錯誤是「RVM不是一個函數,選擇使用'rvm use ...'的紅寶石將無法工作」。在ruby腳本和irb中運行時出現「RVM不是函數」錯誤

這是我已經試過:在OSX命令提示符
1.「RVM使用@myapp」命令的工作(使用OSX小牛)
2.確信RVM是最新版本。
3.重新加載RVM檢查RVM是在命令提示的功能
4.(仍然失敗在IRB和紅寶石的%x{}
5.根據一些SO帖子,我改變OSX終端偏好從登錄shell /bin/bash/bin/bash --login 。退出,打開新的終端窗口,但所有的努力都是徒勞的。
6.檢查的.bash_profile爲[[-s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*

我如何能得到%x{rvm use @myapp}紅寶石和IRB工作任何想法?

+1

我已經看了這一點,似乎Ruby啓動一個新的子shell來運行系統命令。 – mechanicalfish

回答

0

試試這招:

%x{bash -c 'source "$HOME/.rvm/scripts/rvm"; rvm use @myapp'} 

但是,你真的可以用rvm因爲你已經因爲即使你已經設置了指定的rvm那麼你失去了你的會話,因爲你的終端將被關閉。嘗試使用session寶石設置您的環境,並使用它控制bash會話。

require 'session' 

@myapp = 'ruby-1.8.7-p374' 

bash = Session::Bash.new 

stdout, stderr = bash.execute 'source "$HOME/.rvm/scripts/rvm"' 

stdout, stderr = bash.execute "rvm use #{@myapp}" 
puts stdout 

# => Using /home/malo/.rvm/gems/ruby-1.8.7-p374 
+0

它沒有多大意義,因爲在完成這個命令後,加載的環境就會丟失 – mpapis

+0

當然,因爲'%x {'''只是'exec'產生了新進程,在其shell中運行該命令,並在退出時運行。您可能會重新描述您的任務,使其更接近您的實際需求。 –

+0

@LajosVeres自從對話開始以來,把它放在一邊毫無意義。 –

1

這裏會發生什麼事是,shell你已經開始rubyirb與已rvm定義既作爲function並添加到PATH的功能優先的外殼,這一切工作正常,但是當你打開rubyirb它是一個新進程,它只繼承環境變量,其中包括PATH並且不繼承函數,另外從ruby運行%x{}創建另一個既不是登錄名也不是交互式shell的shell進程,它們將分別使shell加載~/.bash_profile~/.bashrc

取決於你想做的事,你有幾個選項,執行另一個ruby/gem可以使用rvm ... do ...%x{}像這樣什麼:

rvm @myapp do ruby -e '...' 

OR:

rvm @myapp do gem install ... 

OR :

rvm @myapp do bundle install 

它允許單個命令運行在給定的紅寶石上下文

+0

你能否解釋一下如何在ruby文件中實現這個選項?你是說在我的'my_magic_file.rb'中,我說:'rvm @myapp do ruby​​ -e'%x {gem install some_gem;捆綁安裝}'結束'? – HM1

+0

感謝您解釋發生了什麼。我選擇使用@majioa答案,因爲它更直接,第二,當我在命令行中使用'rvm ... do ...'語句時,發現響應速度較慢,而對於'rvm use @myapp; ...' – HM1

相關問題