2015-05-11 4 views
13

Я хочу установить последнюю стабильную версию Ruby, доступную с rbenv. Эта функция won't be happening в самом rbenv.Установить последнюю стабильную версию Ruby Использование rbenv

Когда я запускаю команду 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 

Моя цель заключается в автоматизации команды rbenv install VERSION в сценарий оболочки, где VERSION является самым высоким x.x.x релиз. Другими словами, мне нужно автоматически подставить самую высокую запись в списке, которая начинается с числа и не заканчивается -something в VERSION. Из этого списка мне нужно 2.2.2.

Что я могу добавить в свой сценарий оболочки, чтобы автоматически выбрать самую высокую версию x.x.x в команде rbenv install x.x.x?

Редактировать: Поскольку Ruby еще не установлен, решение должно быть в Bash, а не в Ruby.

Редактировать 2: Я хочу версию MRI (mainstream) Ruby.

+1

Мне кажется, вам просто нужен последний в списке, который начинается с числа (поскольку вы, по-видимому, хотите МРТ), и не имеет 'pre',' dev' или 'rC#' в своем имени). Что-то вроде этого будет работать: 'lines.reverse_each.find {| версия | version = ~/^ \ d/&& version! ~/pre | dev | rc \ d /} ' –

+1

(я не могу гарантировать, что это всегда будет работать, но, возможно, это поможет вам начать работу. Если вам интересно как Ruby-build сортирует список, вы можете увидеть его здесь: https://github.com/sstephenson/ruby-build/blob/master/bin/ruby-build#L1012) –

+0

Спасибо @Jordan за комментарии. Мне нужно, чтобы результат был в Bash, хотя Ruby еще не установлен. Алгоритм сортировки замечателен, спасибо, указав его. –

ответ

5
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;}' 
+0

Это волшебство, которое я хотел. Ответ принят. Благодаря! –

+2

Просто примечание для всех, кто использует Debian (по крайней мере, с Debian 8 Jessie) - по умолчанию версия awk не поддерживает '[[: space:]]'. Просто замените его на '[\ t]', чтобы получить тот же результат. –

1

После нескольких пробных ошибок я понял способ захватить последнюю стабильную версию из этого списка. Это не идеально, поскольку он просто захватывает правильный шаблон и последнюю версию, но он должен выполнить свою работу. Он будет работать до тех пор, пока версии будут в порядке.

Это произведет 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) 
+0

Не будет последней стабильной версии, если последняя стабильная версия имеет номер патча (например, '2.0.0-p645'), не так ли? Вам определенно нужен последний уровень патча, поскольку они часто содержат исправления безопасности. –

+0

@ Jordan Ruby больше не использует номера патчей. См. Https://www.ruby-lang.org/en/news/2013/12/21/ruby-version-policy-changes-with-2-1-0/. Будет представлена ​​самая последняя стабильная и исправленная версия по последней подростковой версии, которая именно это определяет этот код. –

+0

Ах. Тогда это немного упростит. –

-2

я предпочел бы сделать это в Ruby, чем в Баш.

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

Я тоже :) Но Ruby еще не установлен;) +1 для решения Ruby хотя :) –

+0

Я считаю, что можно скомпилировать исполняемый файл с помощью Rubinius: http://rubini.us/2011/03/17/running -руб-с-не-рубин/ –

+0

Я заглянул в раствор Рубиния. Из всего, что я могу сказать, получается только байт-код Rubinius. Поэтому мне по-прежнему нужна их виртуальная машина или что-то еще для выполнения кода. Это не скомпилированный машинный код, и сначала мне понадобится Rubinius для этого. –

20

Простое решение :

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

Отфильтровывает все версии, содержащие дефис -, который представляет собой все версии, отличные от МРТ, и предварительные версии МРТ. Затем выбирается последний, гарантированный наивысший результат, поскольку выход ruby-build уже отсортирован по номеру версии по возрастанию.

+0

Может быть, лучше сделать это в Баше, чем в Ruby ... –

+1

Хороший подход. Я не заметил, что версии MRI являются единственными без дефиса. –

+1

Когда я попытался назначить это переменной оболочки, значение имело некоторые ведущие пробелы, которые вызывают ошибку. Это решило проблему: LATEST_RUBY_VERSION = "$ (rbenv install -l | grep -v - | tail -1 | tr -d '[[: space:]]')" – peflorencio

0

Шахта похожа на ответ Аноним (но короче, потому что я использую \ d).

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

Я хотел указать последнюю JRuby, поэтому я использовал «2», так что я могу заменить 2 с «JRuby»:

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

Вы можете заменить JRuby с другими строками для получения разных типов рубина, например rbx, mruby.

Смежные вопросы