Что случилось
На днях я создавал свой сайт портфолио и решил использовать 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
в сценарии оболочки с триггером Дженкинса… Возможно, это была проблема аналогичного характера.