无法使用rvm set保持shell环境,以便通过ruby脚本执行进一步的命令

时间:2013-08-18 23:48:43

标签: ruby rvm

我需要以编程方式设置ruby版本 - >执行bundler - >和Ruby脚本中的其他命令[注意:不希望使用shell脚本执行此操作,它必须通过ruby本身]。

由于默认情况下执行ruby脚本/ irb使用' sh ',而RVM使用' bash / zsh ',我设法使用rvm&amp设置ruby版本;使用以下命令进行bash: %x[bash -lc "rvm use #{ruby_ver}" 2>&1]

问题:在此之后,如果我运行任何系统命令(如bundle install),它不会在我设置ruby版本的同一个bash shell中执行,而是作为一个新shell(再次考虑'sh'),因此执行环境与所需的不同。

即使使用%x[bash -lc #{command}]运行更多命令,它也会被视为不同的shell。

有没有办法: 将shell更改为bash以获取整个ruby脚本执行期或者将shell保留在RVM被触发的位置或者更好的方法来处理这种情况

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

每个Ruby shellout都发生在它自己的离散shell中。你可以做一些事情,比如使用popen来生成一个bash shell,然后将命令传递给它,但是你所做的只是运行一个bash脚本。

您最好的选择是创建一个完整的bash脚本,然后使用rvm do执行它以在您选择的RVM环境的上下文中运行它。你可以通过执行像rvm do 2.0.0 bundle install && rake之类的东西来调用ruby,但是在一天结束时,你正在讨论运行shell命令,所以你应该用shell语法来做。

答案 1 :(得分:0)

你应该使用类似会话(gemsources)之类的东西,还有其他宝石可以做同样的事情,但这个宝石是最好的之一。

安装gem:

gem install session

使用它:

require 'session'
bash = Session::Bash.new

bash.execute( 'long_running_command.exe' ) do |out, err|
  logger << out if out
  elogger << err if err
end

我有一个使用会话来包装rvm的宝石 - rvm-with(gemsources)。