쉘 스크립트에서 RVM이 작동하지 않아 수정해야 했습니다.

3209 단어 rubyjekyllrvm

무슨 일이에요



그래서 저번에 포트폴리오 사이트를 구축하다가 Jekyll을 사용하기로 결정했습니다.

내가 임대하는 서버는 RVM을 통해 Ruby를 실행할 수 있으므로 심볼릭 링크의 힘으로 서버에서 소스를 가져오고 거기에 정적 사이트를 구축하고(쉽게 수행할 수 있음) 서버에 안전하게 제공할 수 있습니다. 인터넷.

그러나 문제가 발생했습니다. 간단한 스크립트가 작동하지 않았습니다.

#/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 인터프리터를 선택하는 함수여야 합니다.)

프로필을 직접 소싱해야 합니다.



you must source the file provided by 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


임의의 생각



Jenkins 트리거 쉘 스크립트에서 pyenv를 사용하려고 시도하는 비슷한 문제가 있었던 것을 기억합니다... 비슷한 성격의 문제였을 수 있습니다.

좋은 웹페이지 즐겨찾기