bashの設定ファイルの読み込みが複雑すぎて混乱する

/etc/profileとか~/.bash_profileとか~/.bash_loginとか~/.profileとか~/.bashrcとか多すぎてわかんねーよヽ(`Д´)ノ
というわけで、調べてみた。
ディストリビューションによって若干異なったりするかもしれない。

ログイン時

/etc/profile
    ↓
(/etc/bash.bashrc) ※Debian系
    ↓
~/.bash_profile (ない場合)↓
    ↓              ~/.bash_login (ない場合)↓
    ↓                                   ~/.profile
    ↓                                        ↓
~/.bashrc   ←←←←←←←←←←←←←←←←←←
    ↓
(/etc/bashrc) ※RedHat
  1. まず/etc/profileが読み込まれる。
    1. また、最近のディストリビューションだと/etc/profileの中で/etc/profile.dの中身を読み込むような設定がされていたりもする。
    2. Debian系の場合、ここで更に/etc/bash.bashrcを読み込むように設定されている。
  2. ~/.bash_profileがあれば読み込む。
    1. ない場合、~/.bash_loginがあれば読み込む。
      1. ない場合、~/.profileがあれば読み込む。
  3. 上記のprofile系が~/.bashrcを読み込む(ように設定されている)。
    1. RedHat系の場合、~/.bashrcが/etc/bashrcを読み込むように設定されている。

という流れになる。
/etc/bash.bashrc、/etc/bashrc、~/.bashrcなどのrc系は途中のファイルの中で明示的に読み込むように設定されているだけで、本来的にはシーケンスには含まれない。


また、~/.bash_profile、~/.bash_login、~/.profileはその順に探して最初に見つかったもののみを読み込む。カスケード的に読み込まれるわけではないので注意。設定が反映されないと思ったら別のファイルがあった罠とか。


あと、ファイルの中でsourceで読み込んでるものがあるので、必ずしも上記の順で処理が進むとは思わない方がよい。
例えばCentOS 5.2だと~/.bash_profile内は~/.bashrcを読み込んでから$PATHを設定するように書かれているし、Ubuntu 8.10でもやはり~/.profile内で~/.bashrcを読み込んでから$PATHを設定するように書かれている。

対話的シェル起動時

これは新たに対話的シェルを起動した場合の話。
一般的には新たにbashを起動したり、suした場合。バッククォートや$()の場合は含まれない。

(/etc/bash.bashrc) ※Debian系
    ↓
~/.bashrc
    ↓
(/etc/bashrc) ※RedHat

profile系は読み込まれなくて、~/.bashrcだけ読み込まれる。

ログアウト時

~/.bash_logout

~/.bash_logoutが読み込まれる。
だいたいclearとかclear-consoleが実行されるようになってる。