无法在ruby中执行RVM shell命令

时间:2011-08-02 01:39:26

标签: ruby shell rvm

长时间潜伏,第一次海报!

目标

我的最终目标是制作一个Rake设置脚本来设置我的rvm环境(我需要动态创建gemsets,为这些gemsets安装gem,并在这些gemsets中运行ruby脚本)。

问题

我需要在我正在执行rvm命令的shell中设置rvm。基本思想是获取rvm脚本as outlined here

当我在ruby中执行shell命令时尝试获取rvm脚本时出现问题。有充分证据表明rvm只支持bash,但ruby在执行shell命令时似乎没有使用bash。

我尝试过什么

我已经尝试了所有方法来执行列出here的shell命令无济于事。为简单起见,我将使用下面的'exec'方法。

似乎虽然ruby认为它使用bash shell来执行这些命令......但事实并非如此。观察!

exec 'echo $SHELL'
=> /bin/bash

但是

exec 'source ~/.rvm/scripts/rvm; type rvm | head -1;'
=> sh: source: not found
=> rvm is ~/.rvm/bin/rvm

这告诉我ruby实际上正在使用/ bin / sh not / bin / bash(该输出应该返回rvm is a function)。我甚至打印了ruby env的东西,ENV [SHELL]是'/ bin / bash'

'暴力'解决方案

我确实有一个解决方法,但它真的很笨拙(这需要我'和'所有的命令一起):

exec 'echo \'source ~/.rvm/scripts/rvm && type rvm | head -1\' | /bin/bash'

如果可能的话,我想避免使用shell脚本 - 我可以在ruby中完成此操作。

2 个答案:

答案 0 :(得分:5)

实际上,RVM实际上暴露了默认包含的Ruby API。将$HOME/.rvm/lib添加到您的$LOAD_PATH;您现在可以使用require 'rvm'

据我所知,这方面的主要文档是源文件本身(摘要在rvm.rb)。

现在您可以编写操作RVM的Ruby脚本,如下所示:

require 'rvm'
env = RVM.current
env.gemset.create('newgemset')

等等。

答案 1 :(得分:1)

使用-c参数调用bash:

command = 'source ~/.rvm/scripts/rvm; type rvm | head -1'
exec "bash -c #{command.inspect}"
相关问题