Ubuntu

Ubuntu22.04 'rvm use ...' will not work

RVMをインストールし、デフォルトで使用するRubyのバージョンを指定したところ、以下のメッセージが表示された。

$ rvm --default use 3.1.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.



広告


Ruby on Railsチュートリアルが教えてくれることを実行できない。
チュートリアルが実行できるローカルの学習環境を作ろうとしていたので、これは困る、なんとかせねば。

原因

ログイン時に source "$HOME/.rvm/scripts/rvm" が実行されていなかった。

RVMのインストーラーは、以下のファイルに設定を追加する。ファイルがなければ作られる。
ほぼまっさら状態だったUbuntu 22.04の場合には、以下の動作だった。

対象のファイル動作設定内容
.bashrc追記PATHの追加
.bash_profile新規作成.profileの読み込み、RVMの機能読み込み
.mkshrc新規作成PATHの追加
.profile追記PATHの追加、RVMの機能読み込み
.zlogin新規作成RVMの機能読み込み
.zshrc新規作成PATHの追加

シェルが最初に起動するスクリプトについて探してみたので、動作を確認してみた。
UNIX & LINUX / Difference between Login Shell and Non-Login Shell?

種別事例最初に起動されるスクリプト
対話型・ログインシェルbashを--loginパラメーターありで起動したとき
SSH接続したとき
.bash_profile
なければ.bashrc
対話型・非ログインシェルGNOME端末を起動したとき
bashを--loginパラメーターなしで起動したとき
.bashrc

GNOME端末は、対話型・非ログインシェルとして起動するので、PATHの追加しか行われず、コマンドが正しく動作していないのだった。

対策

個人的には対策1でやってみようと思っているが、公式は対策2を説明している。

対策1

.bashrcに source "$HOME/.rvm/scripts/rvm" を追加し、.bash_profileを削除する。

追加する行は、.bash_profile にあるから、そこから持ってくる。

.bashrc

…
fi

# Add RVM to PATH for scripting. Make sure this is the last PATH variable change.
export PATH="$PATH:$HOME/.rvm/bin"

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*

※赤文字を追加。

そして、RVMインストーラーにより新規作成された .bash_profile を削除する(名前を変えても良い)。

これで、対話型・ログインシェル、対話型・非ログインシェルのどちらからも .bashrc が呼び出されることになる。
そこで source "$HOME/.rvm/scripts/rvm" が実行される。

スクリプトの中で bash を起動したときにも呼び出されるようになるから、良いのではないかと。

ただし、なぜ、RVMのインストーラは.bash_profileが存在しない場合に、この設定を.bashrcに追記しないのか、その理由を調べ切れていない。
何か理由があるのかもしれないが、恐らくは問題ないだろう。

対策2

GNOME端末を対話型・ログインシェルで起動する。公式で説明されている対策はこれ。
RVM / Integrating RVM with gnome-terminal

インストールされた状態を見ると、以下の順でスクリプトが呼び出されることが分かる。
確かにこれが対策になる。

種別スクリプトの呼び出し備考
対話型・ログインシェル
(GNOME端末の設定変更後)
.bash_profile → .profile → .bashrc.bash_profileはRVMインストーラーが新規に作成。
.profileがあれば呼び出すようになっている。
対話型・非ログインシェル
(GNOME端末のデフォルト)
.bashrc

GNOME端末を対話型・ログインシェルで起動するためには…
設定画面でプロファイル「名前なし」を選択し、コマンドタブにある「ログインシェルとしてコマンドを実行する」にチェックを入れて、設定画面を閉じる。

これで、GNOME端末を開いたとき source "$HOME/.rvm/scripts/rvm" が実行されるので、普通に使っている分には問題いと思われる。

ただし、bash を --login パラメーターなしで起動した場合には、 source "$HOME/.rvm/scripts/rvm" が実行されない。
そのような操作をするスクリプトに出会うまでは問題ない、何か起きたら思い出そう。

この記事を書くきっかけ

rvmのインストール後、ruby-3.1.2のインストールはできたものの、デフォルトを3.1.2に設定できなかった。
再起動しても、変化なし。

冒頭のエラーメッセージで押しててくれた通りにbashを起動すると、コマンドが実行できる。

$ bash --login
$ rvm --default use 3.1.2
Using /home/rohhie/.rvm/gems/ruby-3.1.2

Ruby on Rails チュートリアルを実行する環境を作る記事を書いていて、そこでセットアップ・ティアダウンを繰り返す中で、何かを壊したようだ。

あれ?変だな…

案内されたページに行ってみると、GNOME端末の場合には「ログインシェルとしてコマンドを実行する」にチェックを入れて使ってくれ、と書かれている。
実際にやってみると、ターミナルから色が消えてしまった。全部真っ白…エイリアスもない。

「ログインシェル~」のチェックを外し、エラーメッセージの中にあった「/bin/bash --login を使う必要があるかも?」について確認してみる。

RVMインストール前は、このような表示色だった。

rohhie@dreamer:~$ bash --login
rohhie@dreamer:~$ exit
ログアウト

rohhie@dreamer:~$ ssh localhost
rohhie@localhost's password: 
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.19.0-41-generic x86_64)
<省略>
rohhie@dreamer:~$ exit
ログアウト

Connection to localhost closed.
rohhie@dreamer:~$

RVMインストール後は、このような表示色になり、エイリアスが使えなくなっていた。

rohhie@dreamer:~$ bash --login
rohhie@dreamer:~$ exit            ← ログイン後に色が消えた(bash --login)
ログアウト

rohhie@dreamer:~$ ssh localhost
rohhie@localhost's password: 
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.19.0-41-generic x86_64)
<省略>
rohhie@dreamer:~$ exit            ← ログイン後に色が消えた(SSH)
ログアウト

Connection to localhost closed.
rohhie@dreamer:~$

こりゃ、bashの初期設定がまともに動かなくなったようだ。

改めて確認

インストールは本家で教えてくれている手順で実施した。
Ruby Version Manager (RVM)

このときに表示されているメッセージを改めて確認、シェルに関わるファイルに色々と手を入れている。

$ sudo apt install gnupg2
$ gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
$ \curl -sSL https://get.rvm.io | bash -s stable
Downloading https://github.com/rvm/rvm/archive/1.29.12.tar.gz
Downloading https://github.com/rvm/rvm/releases/download/1.29.12/1.29.12.tar.gz.asc
gpg: 2021年01月16日 03時46分22秒 JSTに施された署名
gpg:                RSA鍵7D2BAF1CF37B13E2069D6956105BD0E739499BDBを使用
gpg: "Piotr Kuczynski <piotr.kuczynski@gmail.com>"からの正しい署名 [不明の]
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg:          この署名が所有者のものかどうかの検証手段がありません。
主鍵フィンガープリント: 7D2B AF1C F37B 13E2 069D  6956 105B D0E7 3949 9BDB
GPG verified '/home/rohhie/.rvm/archives/rvm-1.29.12.tgz'
Installing RVM to /home/rohhie/.rvm/
    Adding rvm PATH line to /home/rohhie/.profile /home/rohhie/.mkshrc /home/rohhie/.bashrc /home/rohhie/.zshrc.
    Adding rvm loading line to /home/rohhie/.profile /home/rohhie/.bash_profile /home/rohhie/.zlogin.
Installation of RVM in /home/rohhie/.rvm/ is almost complete:

  * To start using RVM you need to run `source /home/rohhie/.rvm/scripts/rvm`
    in all your open shell windows, in rare cases you need to reopen all shell windows.
Thanks for installing RVM 🙏
Please consider donating to our open collective to help us maintain RVM.

👉  Donate: https://opencollective.com/rvm/donate

黄色部分が関係して何かが起きているのだろう。

起きていたこと

それぞれのスクリプトの先頭に echo を入れて、非ログインシェルとログインシェルがどう呼び出されるのか確認してみた。

種別試した方法スクリプトの呼び出し
対話型・ログインシェルbash --login.bash_profile(本来はこのあと .profile → .bashrc の順に読み込む)
対話型・非ログインシェルbash.bashrc

RMVインストーラーは、.bash_profile に .profile を呼び出すコードをセットで書き込むはず。
でも、この時には .profile を呼び出すコードが書かれていなかった。

これでは、表示色もエイリアスも上手く動かない。

対策の検討

今ある状態から、単純に .bashrc で source .bash_profile を実行すれば良いのかと考えたが、それは逆だと教えてくれている。
ask Ubuntu / Why ~/.bash_profile is not getting sourced when opening a terminal?

それなら .bash_profile から source .bashrc を実行すれば良いかというと、できあがる状態に差が生まれるのと、.profileの存在が気になる。
ask Ubuntu / Configure gnome-terminal to start bash as a login shell, doesn't read .bashrc

その後、ログインシェルと非ログインシェルで、最初に起動されるスクリプトが違うことが分かった。
ならば、インストーラーが実行されるまで .bash_profile というファイルは存在しないのだから、消してしまえばいいんじゃないの?と対策1の立案に至る。

だけど、これはこれでRVMインストーラーの思想からは外れているということだよなー、とも考えて、対策2を含めた記事になった。

.bashrcが実行されない原因

本来は、.bash_profile に .profile を呼び出すコードが書かれていて、.profile では .bashrcを呼び出すはず。
だけど、.profile にそのコードが書かれていなかった。

これが原因だけれど、なぜそんなことになったのか。

答えは、.bash_profile が 0バイト のファイルだったときに、RVMインストールを実行したから。

.bash_profile

 
[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*

.bash_profile がなければ、以下のファイルができあがる。

.bash_profile

 
[[ -s "$HOME/.profile" ]] && source "$HOME/.profile" # Load the default .profile

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*

インストール時に .bash_profile があるのかないのかで、赤文字を追加する・しないを決めているようだ。

.profile の中では、.bashrc を呼び出している。
これで、.bash_profile → .profile → .bashrc という順で呼び出されるようになる訳ね。

.profile

…
# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi
…

ようやくすっきりと納得。

さいごに

この投稿を最初に書き始めたときと、書き終わった今とでは、書こうと思っていたことが全然違っている。

最初は「ターミナルから色が消えた…エイリアスもなくなっている…」と書くつもりだった。
しかし、結果としては「インストーラーが作った不要なファイルを消そう」と書いている。

そもそも日頃あまり .bashrc を触らないし、他のシェルも触らない。
だから、この手の問題が発生するとだいぶ困る。まずはそれを解消しないと操作しづらいし、詳しくないから単純に手を入れられないし、で割と困ってしまう。
調べていくうちに色々とわかってきたので対策を考えたが、念押しで発生原因を調べたら更に対策が変わるという。

ログインシェルと非ログインシェルの違いがわかったので良かった。
でも、まずは発生原因の確認からだよなぁ。反省せねば。

広告

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他