使用rbenv安装Ruby的最新稳定版本

我想用rbenv安装最新的稳定版本的Ruby。 rbenv本身不会发生此function。

当我在shell中运行命令rbenv install -l时,我得到一长串可用版本。 该列表包含所有类型的条目。 以下是部分列表,以展示格式和多样性:

 $ rbenv install -l Available versions: 2.0.0-p643 2.0.0-p645 2.1.0-dev 2.1.0-preview1 2.1.0-preview2 2.1.0-rc1 2.1.4 2.1.5 2.1.6 2.2.0-dev 2.2.0-preview1 2.2.0-preview2 2.2.0-rc1 2.2.0 2.2.1 2.2.2 2.3.0-dev jruby-1.7.19 jruby-1.7.20 jruby-9.0.0.0-dev jruby-9.0.0.0+graal-dev jruby-9.0.0.0.pre1 jruby-9.0.0.0.pre2 maglev-1.0.0 maglev-1.1.0-dev maglev-2.0.0-dev mruby-dev mruby-1.0.0 mruby-1.1.0 rbx-2.5.2 rbx-2.5.3 ree-1.8.7-2011.12 ree-1.8.7-2012.01 ree-1.8.7-2012.02 topaz-dev 

我的目标是在shell脚本中自动执行命令rbenv install VERSION ,其中VERSION是最高的xxx版本。 换句话说,我需要自动替换列表中以数字开头的最高条目,而不是以-something结尾进入VERSION 。 从这个列表中,我需要2.2.2

我可以在shell脚本中添加什么来自动选择命令rbenv install xxx的最高xxx版本?

编辑:由于尚未安装Ruby,解决方案必须是Bash而不是Ruby。

编辑2:我想要Ruby(主流)版本的Ruby。

 rbenv install -l | awk -F '.' ' /^[[:space:]]*[0-9]+\.[0-9]+\.[0-9]+[[:space:]]*$/ { if ( ($1 * 100 + $2) * 100 + $3 > Max ) { Max = ($1 * 100 + $2) * 100 + $3 Version=$0 } } END { print Version }' 
  • 采取最大的版本(排序或不排序)

如果列表被排序,则更简单的sed(posix版本)就足够了

 rbenv install -l | sed -n '/^[[:space:]]*[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}[[:space:]]*$/ h;${g;p;}' 

简单的解决方案 (直接安装最新的稳定版):

 rbenv install $(rbenv install -l | grep -v - | tail -1) 

说明:

 rbenv install -l | grep -v - | tail -1 

过滤掉所有包含连字符的版本-这是所有非MRI版本和预发布的MRI版本。 然后选择最后一个,保证最高,因为ruby-build输出已按版本号升序排序。

经过相当多的反复试验后,我想出了一种从这个列表中获取最新稳定版本的方法。 这并不完美,因为它只是抓取了正确的模式和它的最后一个版本,但它应该完成工作。 只要版本有序,它就会起作用。

这将产生2.2.2

 rbenv install -l | grep -P "^ [[:digit:]]\.[[:digit:]]\.[[:digit:]]$" | tail -1 

我们可以将结果插入到rbenv install如下所示:

 rbenv install $(rbenv install -l | grep -P "^ [[:digit:]]\.[[:digit:]]\.[[:digit:]]$" | tail -1) 

我的答案与Anonymous的答案相似(但更短,因为我正在使用\ d)。

 rbenv install -l| grep -P "\s2.*(\.|\d)\d$" | tail -1 

我想指定最新的jruby,这就是我使用“2”的原因,所以我可以用“jruby”代替2:

 rbenv install -l| grep -P "\sjruby.*(\.|\d)\d$"|tail -1 

你可以用其他字符串替换jruby来获得不同类型的ruby,例如rbx,mruby。

我更愿意在Ruby中使用而不是在bash中。

 versions = `rbenv install -l` versions.split("\s").select{|v| v.match( /^\d*\.\d*\.\d*$/ )}.last