みずりゅの自由帳

主に参加したイベントやソフトウェア技術/開発について記録しています

ssh接続したUbuntu 19.04 でasdfコマンドが呼べなかった

Ubuntu 19.04 にインストールしたasdfコマンドをssh接続で利用しようとした際に遭遇。

概要:

asdfコマンドが利用できるUbuntu 19.04に対して別端末からsshでログイン。
その際に、asdfコマンドへのパスが通っていなかった。
同様の設定をしていた「CentOS 7.6」では、別端末からのsshログインでもasdfコマンドへのパスは通っていた。

原因は、Ubuntu 19.04側で中身が空の「 ~/.bash_profile 」ファイルを作成していたため。
~/.bash_profile 」 の削除後、ssh接続をやり直したらasdfコマンドへのパスも通った。


説明:

Linux上での「 ~/.bashrc 」と「 ~/.bash_profile 」の取り扱いが関係。

なお、asdfの公式ページでは、Bash on Linux の場合には 「 ~/.bashrc 」がパス記述の指定先になっている。(2019年8月14日時点)

echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc

asdf-vm.com


LinuxBashのmanを読んでみた。要約が以下。

  • ログインシェルでない対話的シェルとして起動すると、「 ~/.bashrc 」を読み込む。
  • 対話的なログインシェル、または--logion付きの非対話的なシェルの場合、「/etc/profile」読込後に「~/.bash_profile」 「~/.bash_login」「~/.profile」の順で最初に見つかったファイルのみを読み込む。

デスクトップからコンソールを起動した際は前者、ssh等で別の端末からログインした際には後者に該当する。

「ask ubuntu」の以下ページの内容によると、デフォルトでUbuntu 19.04 は「 ~/.bash_profile 」「 ~/.bash_login 」を作成していない。

askubuntu.com

そのため、原則デフォルトで作られている「 ~/.profile 」が読み込まれる。
~/.profile 」は、その中で以下のように、「$HOME/.bashrc」(イコール「~/.bashrc」)があれば読込する。
これによって、asdfコマンドの内容も読み込まれる。

    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi


今回の場合は、誤って「~/.bash_profile」を作成していた。
しかも、中身はコメント文のみで空っぽ。
これは、最初に誤って「 ~/.bash_profile 」にasdfコマンドのパスを書いていたため。

更に、「~/.bash_profile」ファイルがあるので、読み込み優先度の低い「~/.profile」が読み込まれなかった。

そのため、デスクトップベースでの操作ではasdfコマンドへのパスが通っていたのに、ssh接続だとasdfのパスは設定が通っていない状況が発生した。

もし、何かしらの理由で「~/.bash_profile」を新規に作成する場合、「~/.profile」の内容をコピーして作るか、最低限「$HOME/.bashrc」を読み込む設定を記述しておくと良い。

余談1

Linuxでは、ユーザ追加時に「/etc/skel」配下の構成が作成される。
自分の環境で動作比較したら、以下の違いがあった。
このため、CentOS 7.6とUbuntu 19.04との挙動の違いが生まれていた。

  • CentOS 7.6の場合、「.bash_logout」「.bash_profile」「.bashrc」
  • Ubuntu 19.04の場合、「.bash_logout」「.bashrc」「.profile」

参考: qiita.com

余談2

asdfの公式ページでは、Bash on macOSの場合は、従来通りに「 ~/.bash_profile 」でした。
これは、Mac OS Xはデフォルトでは「~/.bashrc」を読み込まないため、らしいです。(※出典元求む)

しかし、Nervesのインストール手順中にあるasdfコマンドの設定では、asdfコマンドのパス追記は「~/.bashrc」になっています。
~/.bash_profile 」中に「~/.bashrc」があれば読み込む記述があ流ので問題ないですが、ややこしいですね。

hexdocs.pm