.bash_profile とか .bashrc とかbash起動ファイルの読み込み順
このへんの読み込み順ってすぐ忘れてしまうのでメモ.
シェル
bashの起動タイプ
- オプションの組み合わせにより以下のような起動タイプを持つ.
- ログインシェル
- 対話シェル
- 起動タイプは排他ではなさそうなので「対話的なログインシェル」や「非対話的な非ログインシェル」みたいなものもある.
ログインシェル
- 0 番目の引き数(通常はプログラム名)の最初の文字が
-
であるシェル.
下の-bash
の部分とかがそれ.
[root@www ~]# w 11:46:55 up 12 days, 21:47, 3 users, load average: 0.00, 0.01, 0.05 USER TTY LOGIN@ IDLE JCPU PCPU WHAT root tty1 30 7月14 12days 0.12s 0.12s -bash
- または
--login
オプション付きで起動されたシェル.
対話シェル
- 以下の条件をすべて満たして起動されたシェル.
- オプションでない引数がない.
- 標準入力と標準エラー出力がいずれも端末に接続されている.
- isatty(3) で調べられる.
-c
オプションが指定されていない.
- または
-i
オプション付きで起動されたシェル. - bash が対話的に動作している場合には,PS1 が設定され,
$-
にi
が含まれる.
起動ファイルの読み込み順
- 対話的/非対話的なログインシェル
- 最初に
/etc/profile
を読み込み. - 次に
~/.bash_profile
~/.bash_login
~/.profile
の順番で探し,最初に見つかったファイルを読み込む.
おそらくこの3ファイル読み込みは排他.--noprofile
オプションを使ってこの動作を行わないようにできる.
- ログインシェルの終了時に
~/.bash_logout
ファイルがあればこれを読み込む.
- 最初に
- ログインシェルでない対話的なシェル
~/.bashrc
を読み込み.--norc
オプションを使ってこの動作を行わないようにできる.--rcfile file
オプションを使うと,~/.bashrc
からfile
に変更することができる.
実際に確認してみた
- 各起動ファイルの先頭にechoを入れて呼び出されたことをわかるようにする.
- 起動タイプの組み合わせ毎に実際の読み込み順を確認.
- 確認環境は CentOS 7
ログインシェル,対話
- --login でログインシェル
- -i で対話シェル
[root@www ~]# bash --login -i called /etc/profile called /etc/profile.d/*.sh called ~/.bash_profile called ~/.bashrc called /etc/bashrc
ログインシェル,非対話
- --login でログインシェル
- -c で非対話シェル
- shopt でログインシェルかどうかの確認
[root@www ~]# bash --login -c shopt | grep -E 'called|login_shell' called /etc/profile called ~/.bash_profile called ~/.bashrc called /etc/bashrc login_shell on
非ログインシェル,対話
- -i で対話シェル
- shopt でログインシェルかどうかの確認
[root@www ~]# bash -i -c shopt | grep -E 'called|login_shell' called ~/.bashrc called /etc/bashrc called /etc/profile.d/*.sh login_shell off
非ログインシェル,非対話
- -c で非対話シェル
- shopt でログインシェルかどうかの確認
[root@www19312ui ~]# bash -c shopt | grep -E 'called|login_shell' login_shell off