source .bashrc 等でシェルの動作確認するのはやめてほしい
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 は ~/.bashrc
で alias ll='ls -alF'
のようなエイリアスがデフォルトで登録されているので, 他者がセットアップしたサーバーで ll
を叩いたときに「llが無い...なんかおかしいな」という感じでよく気づきます.
Discussion