&引用;RVM不是一个函数;在ruby脚本和irb中运行时出错

&引用;RVM不是一个函数;在ruby脚本和irb中运行时出错,ruby,rvm,Ruby,Rvm,我在ruby和irb中运行%x{rvm use@myapp}时出错。错误是“RVM不是一个函数,选择带有“RVM使用…”的红宝石将不起作用” 以下是我尝试过的: 1.“rvm use@myapp”命令在OSX命令提示符下工作(使用OSX Mavericks) 2.确保RVM是最新版本。 3.重新加载的RVM check RVM是命令提示符中的一个功能 4.(在irb和ruby的%x{}中仍然失败) 5.根据一些SO帖子,我将OSX终端首选项从登录shell更改为/bin/bash和/bin/ba

我在ruby和irb中运行
%x{rvm use@myapp}
时出错。错误是“RVM不是一个函数,选择带有“RVM使用…”的红宝石将不起作用”

以下是我尝试过的:
1.“rvm use@myapp”命令在OSX命令提示符下工作(使用OSX Mavericks)
2.确保RVM是最新版本。
3.重新加载的RVM check RVM是命令提示符中的一个功能
4.(在irb和ruby的
%x{}
中仍然失败)
5.根据一些SO帖子,我将OSX终端首选项从登录shell更改为
/bin/bash
/bin/bash--login
。退出,打开新的终端窗口,但所有努力都白费了。
6.选中
[-s“$HOME/.rvm/scripts/rvm”]&&source“$HOME/.rvm/scripts/rvm”的.bash_配置文件#将rvm作为函数加载到shell会话*

关于如何让
%x{rvm use@myapp}
在ruby和irb中工作,有什么想法吗?

试试这个技巧:

%x{bash -c 'source "$HOME/.rvm/scripts/rvm"; rvm use @myapp'}
但是,您确实可以按照指定使用
rvm
,因为即使设置了
rvm
,您也会因为终端将关闭而丢失会话。尝试使用
session
gem设置您的环境,并使用它控制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

这里发生的事情是,您使用had
rvm
启动
ruby
irb
shell
被定义为
函数,并添加到
路径
中,该函数在shell中具有优先权,并且运行良好,但是当您打开
ruby
irb
时,它是一个新进程,它只继承包含
PATH
的环境变量,而不继承函数,另外从ruby运行
%x{}
会创建另一个既不是登录也不是交互式shell的shell进程,它们分别使shell加载
~/.bash_profile
~/.bashrc

根据您想做什么,您几乎没有选择,要执行另一个
ruby
/
gem
,您可以使用
rvm。。。对from
%x{}
执行以下操作:

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

或:


它允许在给定ruby的上下文中运行单个命令

我已经对此进行了一些研究,ruby似乎启动了一个新的子shell来运行系统命令。这没有多大意义,因为加载的环境在完成此命令后立即丢失,当然,因为
%x{}
只是
exec
生成了新的进程,在外壳中运行命令,并在退出时运行命令。您可能需要重新描述您的任务,使其更接近您的实际需要。@LajosVeres由于对话已经在这里开始,因此将其移到其他位置是没有意义的。@LajosVeres这当然为问题提供了准确的答案,而没有向右侧或左侧抛出,添加的部分是
rvm with
gem在后台所做的(有额外的检查和改进)=>您能解释一下如何在ruby文件中实现这个选项吗?你是说在我的
my_magic_file.rb
中,我写了:
rvm@myapp do ruby-e''%x{gem install some_gem;bundle install}'end
?谢谢你解释引擎盖下发生的事情。我选择使用@majioa答案,因为它更直截了当,第二,当使用
rvm时,我注意到反应较慢。。。在命令行中执行…
语句vs
rvm use@myapp
rvm @myapp do gem install ...
rvm @myapp do bundle install