RVM не работал в сценарии оболочки, поэтому мне пришлось его исправить


Что случилось

На днях я создавал свой сайт портфолио и решил использовать Jekyll.

Сервер, который я арендую, может работать с Ruby через RVM, так что с помощью символических ссылок я могу вытащить исходники на сервер, собрать там статический сайт (что можно сделать в мгновение ока) и безопасно передать его в Интернет.

Но я столкнулся с проблемой — скрипт, простой как этот, не работал:

#/usr/bin/env bash

set -eu

rvm use 2.7.2
Войти в полноэкранный режим Выйти из полноэкранного режима
RVM is not a function, selecting rubies with 'rvm use ...' will not work.

You need to change your terminal emulator preferences to allow login shell.
Sometimes it is required to use `/bin/bash --login` as the command.
Please visit https://rvm.io/integration/gnome-terminal/ for an example.
Войти в полноэкранный режим Выйти из полноэкранного режима

Интересно, что RVM, который я использую в терминале, это не /usr/local/rvm/bin/rvm, а функция оболочки, которая внедряется как часть профиля.

# Run type command directly from the shell prompt
$ type rvm
rvm is a function
(function gets printed out)

# shell script that contains `type rvm`
$ ./test.sh
rvm is /usr/local/rvm/bin/rvm
Вход в полноэкранный режим Выход из полноэкранного режима

(NGL, я был весьма озадачен, когда они сказали «RVM не является функцией…». Типа, RVM жалуется, что я пытался использовать RVM как функцию, когда она не может быть функцией? Не-а! Это означает, что существует версия RVM для функций оболочки, а rvm должна быть функцией для выбора интерпретаторов Ruby).

Вы должны сами найти исходный код профиля.

Оказывается, вы должны source файл, предоставляемый RVM. RVM может существовать в двух местах:

source "$HOME/.rvm/scripts/rvm" # $HOME installation
source "/usr/local/rvm/scripts/rvm" # System installation
Вход в полноэкранный режим Выход из полноэкранного режима

Но это не совсем помогло.

Очевидно, RVM полагается на несвязанные переменные, поэтому запуск скрипта с set -eu приводит к его краху:

#!/usr/bin/env bash

set -eu

source "/usr/local/rvm/scripts/rvm"

rvm use 2.7.2
Вход в полноэкранный режим Выход из полноэкранного режима
/usr/local/rvm/scripts/functions/support: Line 182: _system_name: Unbound variable
Войти в полноэкранный режим Выход из полноэкранного режима

Поэтому нам нужно временно разрешить такие переменные, пока мы выполняем все команды RVM.

Пример рабочего сценария

#!/usr/bin/env bash

set +u # WTF: Avoid RVM crashing due to unbound variables

source "/usr/local/rvm/scripts/rvm"
rvm use 2.7.2

set -eu # Restore strict error checking

bundle install
JEKYLL_ENV=production bundle exec jekyll build
Войти в полноэкранный режим Выйти из полноэкранного режима

Случайная мысль

Помнится, у меня была похожая проблема, когда я пытался использовать pyenv в сценарии оболочки с триггером Дженкинса… Возможно, это была проблема аналогичного характера.

Оцените статью
Procodings.ru
Добавить комментарий