Подтвердить что ты не робот

Установка последней стабильной версии Ruby Использование rbenv

Я хочу установить последнюю стабильную версию Ruby, доступную с rbenv. Эта функция не будет происходить в самом 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 в оболочке script, где VERSION является высшей версией x.x.x. Другими словами, мне нужно автоматически подставить самую высокую запись в списке, которая начинается с числа, и не заканчивается -something на VERSION. Из этого списка мне нужно 2.2.2.

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

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

Изменить 2: Я хочу версию MRI (mainstream) Ruby.

4b9b3361

Ответ 1

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;}'

Ответ 2

Простое решение (напрямую устанавливает последнюю стабильную версию):

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

Объяснение:

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

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

Ответ 3

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

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

Ответ 4

Мина похожа на анонимный ответ (но короче, потому что я использую \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 другими строками, чтобы получить разные типы ruby, например. rbx, mruby.

Ответ 5

Сначала нужно обновить ruby-build, чтобы получить последнюю версию ruby при установке с использованием rbenv. Выполните следующие шаги:

  • brew reinstall --HEAD ruby-build (если rbenv уже установлен, brew может из-за какой-то ошибки затем двигаться дальше и просто
    • brew unlink ruby-build и
    • brew install --HEAD ruby-build)
  • brew upgrade
  • и затем вы можете использовать один из вышеуказанных подходов, предложенных выше, для автоматической установки последней версии или просто rbenv install <required latest version>

работа в macOS 10.13.6

Ответ 6

Я бы скорее сделал это в Ruby, чем в bash.

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