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
- ログインシェルでない対話的シェルとして起動すると、「 ~/.bashrc 」を読み込む。
- 対話的なログインシェル、または--logion付きの非対話的なシェルの場合、「/etc/profile」読込後に「~/.bash_profile」 「~/.bash_login」「~/.profile」の順で最初に見つかったファイルのみを読み込む。
デスクトップからコンソールを起動した際は前者、ssh等で別の端末からログインした際には後者に該当する。
「ask ubuntu」の以下ページの内容によると、デフォルトでUbuntu 19.04 は「 ~/.bash_profile 」「 ~/.bash_login 」を作成していない。
そのため、原則デフォルトで作られている「 ~/.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」を読み込む設定を記述しておくと良い。