DEV Community

C. Plug
C. Plug

Posted on

RVM did not work in the shell script, so I had to fix it

What happened

So I was building my portfolio site the other day and I decided to use Jekyll.

The server I'm renting can run Ruby via RVM, so with the power of symbolic links, I can pull the source on the server, build the static site there (which can be done in a breeze,) and safely serve it to the Internet.

But I ran into a problem - the script simple as this did not work:

#/usr/bin/env bash set -eu rvm use 2.7.2 
Enter fullscreen mode Exit fullscreen mode
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. 
Enter fullscreen mode Exit fullscreen mode

Interesting, so RVM I use at the terminal prompt is not /usr/local/rvm/bin/rvm but a shell function that gets injected as a part of the profile.

# 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 
Enter fullscreen mode Exit fullscreen mode

(NGL, I was fairly confused when they said "RVM is not a function..." Like, is RVM complaining that I tried to use RVM as a function when it cannot possibly be a function? Nope! What it means is that there is a shell function version of RVM and rvm must be a function to select Ruby interpreters.)

You need to source the profile yourselves

It turns out you must source the file provided by RVM. There can be two places that RVM may exist:

source "$HOME/.rvm/scripts/rvm" # $HOME installation source "/usr/local/rvm/scripts/rvm" # System installation 
Enter fullscreen mode Exit fullscreen mode

But that did not quite do the trick

Apparently, RVM relies on unbound variables, so running the script with set -eu crashes it:

#!/usr/bin/env bash set -eu source "/usr/local/rvm/scripts/rvm" rvm use 2.7.2 
Enter fullscreen mode Exit fullscreen mode
/usr/local/rvm/scripts/functions/support: Line 182: _system_name: Unbound variable 
Enter fullscreen mode Exit fullscreen mode

So we need to temporarily allow such variables while we run all the RVM commands.

Example working script

#!/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 
Enter fullscreen mode Exit fullscreen mode

Random thought

I remember having similar issue trying to use pyenv in a Jenkins-triggered shell script... It could've been an issue of the similar nature.

Top comments (0)