やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

rbenvでRubyの最新安定版をインストールするワンライナー

 ググったやつは余計な文字が含まれていたので改良版。

前提

 rbenvをインストールしておくこと。

ワンライナー

rbenv install $(rbenv install -l  2>/dev/null | grep -v - | tail -1)
rbenv install $(rbenv install -l 2>/dev/null | grep '^[0-9]+.[0-9]+.[0-9]+$' | tail -1)

分解

 まずはインストール可能なバージョン一覧を取得する。ここからStable最新版だけを入手したい。

rbenv install -l
2.6.8
2.7.4
3.0.2
jruby-9.3.1.0
mruby-3.0.0
rbx-5.0
truffleruby-21.2.0.1
truffleruby+graalvm-21.2.0

Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all / -L' to show all local versions.

 ググったら以下コードが見つかった。

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

 grep -v --が含まれている行を除外する。jruby-9.3.1.0などがそれ。どうやら特殊な処理系のものは-がついているらしい。なのでgrep -v -にて特殊な処理系を除外している。

 実行すると以下のようになった。まだ余計なテキストが含まれている。


Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all / -L' to show all local versions.
3.0.2

 余計なテキストはstderrの内容だと思われるので、/dev/nullで捨てる。

rbenv install -l 2>/dev/null | grep -v - | tail -1
3.0.2

 OK。

 このままでもいいが、ちょっと変える。条件は以下のほうがわかりやすい。特殊な処理系に-がつくというルールは将来変更される可能性もある。なのでもっと明確に書く。

rbenv install -l 2>/dev/null | grep '^[0-9]+.[0-9]+.[0-9]+$' | tail -1
3.0.2

 関数化する。

RubyStableVersion() { rbenv install -l 2>/dev/null | grep '^[0-9]+.[0-9]+.[0-9]+$' | tail -1; }

 インストールコマンドに渡す。

rbenv install $(RubyStableVersion)

 関数化しないのであれば以下のうちどれか。

rbenv install $(rbenv install -l 2>/dev/null | grep '^[0-9]+.[0-9]+.[0-9]+$' | tail -1)
rbenv install $(rbenv install -l 2>/dev/null | grep -v - | tail -1)

所感

 こういうのは専用コマンドで用意していてほしい。以下みたいに。ていうか引数stableがなければ自動的に最新安定版をインストールしてほしい。あるいはそうしていいですか?[y/n]みたいな入力を受け付けて提案してほしい。

rbenv install stable
$ rbenv install
最新安定版 3.0.2 をインストールしますか? [y/n]: 

対象環境

$ uname -a
Linux raspberrypi 5.10.52-v7l+ #1441 SMP Tue Aug 3 18:11:56 BST 2021 armv7l GNU/Linux