🐚

source .bashrc 等でシェルの動作確認するのはやめてほしい

2024/08/30に公開

source コマンドを使用したシェルの設定確認はやめてほしいです.

代わりに,

exec $SHELL -l

を使用してください.

どうして

.bashrc, .profile, .bash_profile などのシェル設定ファイルやPATH/環境変数の設定を確認する際に, source コマンド(e.g. source .bashrc) を利用するのはおすすめできません.

既に読み込まれた設定が残っているため, 設定が正しく反映されているかどうかや, 設定の参照状況や優先順位を確認することが難しくなるからです.

「source コマンドでパスが通ったのが確認できたのでOKだ!」って言って「OS再起動したら使えなくなったんですけど...」なんてことをよく観測するのです.

そのため, シェルを新たに起動する exec $SHELL -l の使用を強く, 強く推奨します.

-l オプションは, ログインシェルとしてシェルを起動するためのオプションです.
通常のログインシェルの初期化手順を踏むようになり, 環境変数や設定ファイルが新たに読み込まれるため, source コマンドを使用した場合と異なり, 正確な設定の適用状況を確認できるようになります.

言わずもがなですが, $SHELL はデフォルトのシェルを設定する環境変数です.

$ echo $SHELL
/bin/bash

おまけ

環境変数もクリアするには

exec env - $SHELL -l

のように, env - も指定すると環境変数もクリアできます.

デモ

# 環境変数を設定してみます
$ export HOGE=FUGA
# 確認してみます
$ echo $HOGE
FUGA

# シェルを再起動してみます
$ exec $SHELL -l
# 環境変数を確認します
$ echo $HOGE
FUGA

# env - を付加してみます
$ exec env - $SHELL -l
# 環境変数がクリアされています!
$ echo $HOGE

# $HOME も消えて, ホームディレクトリにいるのに面白いことになっていますね.
$ echo $HOME

$ cd
bash: cd: HOME not set
$ pwd
/home/ubuntu

# (おまけ)環境変数を一覧してみます
$ printenv
PWD=/home/ubuntu
SHLVL=1
PS1=(省略)
_=/bin/printenv

$TERM 周りも消えるので, シェルの設定等によってはカーソル移動やテキスト入力もままならなくなる場合もあります. 必要に応じて賢く使ってみてください. 私はあんまり使いません.(え?)

.profile が既にある環境に .bash_profile を作成しないで

Ubuntu も最近のバージョン(22くらい?)では .bash_profile ではなく .profile がデフォルトで設置されるようになりましたよね.

詳細はドキュメントなり漁って欲しいんですが,
~/.bash_profile => ~/.bash_login => ~/.profile の順で排他的に読み込まれるので, ~/.bash_profile を単純設置してはいけないんです.

で, 中を読むと .profile.bashrc を読み込んでいるので, .bash_profile を単純設置するとそれが優先かつ排他で読み込まれるので .bashrc も読み込まれず壊れる, みたいなことが起こるわけです.

余談ですが, 最近の Ubuntu は ~/.bashrcalias ll='ls -alF' のようなエイリアスがデフォルトで登録されているので, 他者がセットアップしたサーバーで ll を叩いたときに「llが無い...なんかおかしいな」という感じでよく気づきます.

Discussion