【问题标题】:Cannot execute RVM shell commands in ruby无法在 ruby​​ 中执行 RVM shell 命令
【发布时间】:2011-08-02 01:39:25
【问题描述】:

潜伏已久,第一次发帖!

目标

我的最终目标是制作一个 Rake 设置脚本来设置我的 rvm 环境内容(我需要动态创建 gemset,将 gem 安装到这些 gemset,并在这些 gemset 中运行 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 而不是 /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​​ 中完成这似乎是合理的。

【问题讨论】:

    标签: ruby shell rvm


    【解决方案1】:

    碰巧的是,RVM 实际上公开了一个默认包含的 Ruby API。将$HOME/.rvm/lib 添加到您的$LOAD_PATH;你现在可以使用require 'rvm'

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

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

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

    等等。

    【讨论】:

    • 太棒了——这正是我想要的。只是出于好奇,我对该代码进行了顶峰-他们在概念上与上面的“蛮力”方法类似……只是以一种更巧妙的方式(他们使用 open3 运行 bash shell 并向其发送命令) .
    【解决方案2】:

    使用 -c 参数调用 bash:

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

    【讨论】:

    • 是否 rvm-shell 而不是 bash 替换了源 rvm foo?
    • 好问题,@neonlex。我想是的...从我的经验来看,rvm-shell 似乎是一个不错的方法。
    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2014-12-29
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    相关资源
    最近更新 更多