使用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