【问题标题】:Unable to permanently affect active Ruby version in Linux environment via RVM when command executed inside of shell script在 shell 脚本中执行命令时,无法通过 RVM 永久影响 Linux 环境中的活动 Ruby 版本
【发布时间】:2015-05-04 08:15:04
【问题描述】:

所以在今晚的大部分时间里,我一直在努力编写一个 bash 脚本,以帮助简化/自动化/引导(无论您想怎么称呼它)我的开发环境,从从头开始。

我正在以模块化方式编写脚本,即编写完全自包含的小脚本,这些小脚本独立于较大的整体脚本运行,然后将其集成到脚本流中。

我正在使用的当前 scriptlet 与交互式更改活动 Ruby 版本有关,如果您要安装的版本已经存在,如果您想要的版本不存在,它将安装并将其设置为活动版本。

这主要是对整个过程的增强,对脚本本身一点也不重要,但是是一个非常大的“很高兴拥有”

至于我在准备编写这个功能时已经做了什么:

  1. 将我的终端设置为接受 shell 登录 (Linux Mint 17.1)
  2. 添加了源 $HOME/.rvm/scripts/rvm 以使 rvm 在脚本中作为函数运行

首先我将粘贴我测试代码的输出日志,然后我将粘贴脚本代码本身。注意:$crver 只是我创建的一个环境变量,它指向可执行脚本以节省输入时间。

安装新版本的 Ruby:

gabrial@thinkpad ~ $ $crver

rvm rubies

=* ruby-2.2.2 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

Is the version of Ruby you wish to use listed above? (Y/N) n
Enter the Ruby version to install (ex: 2.2.2), followed by [ENTER]: 2.2.1
Searching for binary rubies, this might take some time.
No binary rubies available for: mint/17.1/x86_64/ruby-2.2.1.
Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies.
Checking requirements for mint.
Requirements installation successful.
Installing Ruby from source to: /home/gabrial/.rvm/rubies/ruby-2.2.1, this may take a while depending on your cpu(s)...
ruby-2.2.1 - #downloading ruby-2.2.1, this may take a while depending on your connection...
ruby-2.2.1 - #extracting ruby-2.2.1 to /home/gabrial/.rvm/src/ruby-2.2.1....
ruby-2.2.1 - #applying patch /home/gabrial/.rvm/patches/ruby/2.2.1/fix_installing_bundled_gems.patch.
ruby-2.2.1 - #configuring.........................................................
ruby-2.2.1 - #post-configuration..
ruby-2.2.1 - #compiling...............................................................................
ruby-2.2.1 - #installing.............................
ruby-2.2.1 - #making binaries executable..
ruby-2.2.1 - #downloading rubygems-2.4.6
ruby-2.2.1 - #extracting rubygems-2.4.6.....
ruby-2.2.1 - #removing old rubygems.........
ruby-2.2.1 - #installing rubygems-2.4.6.....................
ruby-2.2.1 - #gemset created /home/gabrial/.rvm/gems/ruby-2.2.1@global
ruby-2.2.1 - #importing gemset /home/gabrial/.rvm/gemsets/global.gems...............................................
ruby-2.2.1 - #generating global wrappers........
ruby-2.2.1 - #gemset created /home/gabrial/.rvm/gems/ruby-2.2.1
ruby-2.2.1 - #importing gemsetfile /home/gabrial/.rvm/gemsets/default.gems evaluated to empty gem list
ruby-2.2.1 - #generating default wrappers........
ruby-2.2.1 - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
Install of ruby-2.2.1 - #complete 
Ruby was built without documentation, to build it run: rvm docs generate-ri
Using /home/gabrial/.rvm/gems/ruby-2.2.1
gabrial@thinkpad ~ $ rvm list

rvm rubies

   ruby-2.2.1 [ x86_64 ]
=* ruby-2.2.2 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

使用预先存在的 Ruby 版本并将其设置为活动状态:

gabrial@thinkpad ~ $ $crver

rvm rubies

   ruby-2.2.1 [ x86_64 ]
=* ruby-2.2.2 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

Is the version of Ruby you wish to use listed above? (Y/N) y
Enter the Ruby version to use (ex: 2.2.2), followed by [ENTER]: 2.2.1
Using /home/gabrial/.rvm/gems/ruby-2.2.1
gabrial@thinkpad ~ $ rvm list

rvm rubies

   ruby-2.2.1 [ x86_64 ]
=* ruby-2.2.2 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

如您所见,在脚本中验证将 Ruby 的版本设置为 2.2.1,但在实际环境中,仍为 2.2.2

奇怪的是,我还尝试使用rvm use $rubyver --default 来部分成功。当直接从命令行运行 rvm list 时,它会显示默认版本的预期符号,但 Ruby 的活动版本保持不变:

gabrial@thinkpad ~ $ $crver

rvm rubies

   ruby-2.2.1 [ x86_64 ]
=* ruby-2.2.2 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

Is the version of Ruby you wish to use listed above? (Y/N) y
Enter the Ruby version to use (ex: 2.2.2), followed by [ENTER]: 2.2.1
Using /home/gabrial/.rvm/gems/ruby-2.2.1
gabrial@thinkpad ~ $ rvm list

rvm rubies

 * ruby-2.2.1 [ x86_64 ]
=> ruby-2.2.2 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

这是脚本本身的代码块:

#!/bin/bash
source $HOME/.rvm/scripts/rvm

rvmexec() {
    msg="Enter the Ruby version to $1 (ex: 2.2.2), followed by [ENTER]: "
    case $1 in
        [use]* )
            read -p "$msg" rubyver
            eval rvm use $rubyver
            unset rubyver;
            break;;
        [install]* )
            read -p "$msg" rubyver
            eval rvm install $rubyver && rvm use $rubyver
            unset rubyver;
            break;;
    esac
}

rvm list
    while true; do
        read -p "Is the version of Ruby you wish to use listed above? (Y/N) " rubyverexist
        case $rubyverexist in
            [Yy]* ) rvmexec use; break;;
            [Nn]* ) rvmexec install; break;;
            * ) echo -e "\nERROR: Please enter a valid response\n";;
        esac
    done

任何帮助将不胜感激,如果我遗漏了任何重要内容,请提前原谅我,现在是凌晨 1 点 13 分,早上 6 点开始工作:)

干杯!

【问题讨论】:

  • 这里有很多信息要查看,我没有时间完全阅读,但只考虑标题和介绍,我猜问题是你期待更改环境变量/等。由脚本完成(通过evalrvm)来影响运行脚本的运行shell 的环境。那是不可能的。那不是这样的。这就是为什么像rvm 这样的东西将环境变量输出为字符串并告诉您eval 他们进行这些更改。如果需要,您也可以从脚本中执行此操作。

标签: ruby bash rvm sh


【解决方案1】:

好吧,经过一番新的审视和 Google 搜索,我发现我所要做的就是在 var(现在是别名)前面加上 source,然后脚本就会按预期运行:

From ~/.profile:
alias crver="source $HOME/workspace/crver.sh"

--- Output Begins ---

gabrial@thinkpad ~ $ rvm list

rvm rubies

   ruby-2.2.1 [ x86_64 ]
=* ruby-2.2.2 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

gabrial@thinkpad ~ $ crver

rvm rubies

   ruby-2.2.1 [ x86_64 ]
=* ruby-2.2.2 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

Is the version of Ruby you wish to use listed above? (Y/N) y
Enter the Ruby version to use (ex: 2.2.2), followed by [ENTER]: 2.2.1
Using /home/gabrial/.rvm/gems/ruby-2.2.1
gabrial@thinkpad ~ $ rvm list

rvm rubies

=* ruby-2.2.1 [ x86_64 ]
   ruby-2.2.2 [ x86_64 ]

# => - current
# =* - current && default
#  * - default

耶!

~鳍

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多