bashの特殊ファイル(.bash_profile, .bashrcとか)のメモ

.bash_profileと.bashrcの違いについてまたグーグル検索。もう何回目だ…

備忘のためにメモしておく。 『入門bash』3章、「環境のカスタマイズ」を参考にしました。

以下3つのファイルを意識しておけばよさそう。ユーザーごとの設定。

  • .bash_profile …ログイン時に読み込まれる
  • .bash_logout …ログアウト時に読み込まれる
  • .bashrc …新しいシェルの起動時に読み込まれる

以下のファイルも特殊ファイルとして認識されるが、自分はあまり使う機会はなさそう。これもユーザーごとの設定。 ログイン時に.bash_profile, .bash_login, .loginの順に検索される。

  • .bash_login …Cシェル由来
  • .profile …Bourneシェル、Kornシェル由来

(.profileについては、他のシェルとの移行|共存がかんたんだよ、ということかな。.bash_loginはCシェル利用者に設計が理解しやすいというだけか?自分はこれらのシェルの設定ファイルを使わないので不要な知識…)

以下はシステム全体の設定。あまり変更することはないだろう。

  • /etc/profile …ログイン時に読み込まれる

理解が不安な、.bash_profile, .bashrc, /etc/profileの挙動を確認してみた。シャープイコール大なり(#=>)の行はコメント。

#=> まずは.bash_profile, .bashrcの確認
$ echo echo .bash_profile is loaded. >> ~/.bash_profile
$ echo echo .bashrc is loaded. >> ~/.bashrc
#=> bashrc, bash_profileにechoを仕込む。
$ echo $SHELL
/usr/bin/fish
#=> ふだんはfishがログインシェル
$ bash
#=> インタラクティブだがログインシェルではないbashを起動。.bashrcが読まれるはず。
.bashrc is loaded.
#=> 期待通り。
$ bash
#=> bash内でさらにbashを起動してみる。
.bashrc is loaded.
#=> もう一度読まれる。まあそうか。
$ ps --forest
#=> プロセスはこんな状態。
  PID TTY          TIME CMD
18565 pts/0    00:00:01 fish
21358 pts/0    00:00:00  \_ bash
21368 pts/0    00:00:00      \_ bash
21385 pts/0    00:00:00          \_ ps
$ exit
$ exit
$ bash --login
#=> ログインシェルとしてbashを起動。.bash_profileが読まれるはず。
.bash_profile is loaded.
#=> そのとおり。
$ ログアウト
$ echo source .bash_profile >> .bashrc
#=> .bashrcが読まれたら、.bash_profileも読まれるようにする。非ログインシェルでも、ログインシェル立ち上げ時に読まれるコードも読まれるようになる。
$ bash
.bashrc is loaded.
.bash_profile is loaded.
$ echo source .bashrc >> .bash_profile
#=> .bash_profileが読まれたら、.bashrcも読まれるようにする。無限ループになるはず
$ exit
$ bash --login
.bash_profile is loaded.
.bashrc is loaded.
.bash_profile is loaded.
.bashrc is loaded.
.bash_profile is loaded.
.bashrc is loaded.
.bash_profile is loaded.
.bashrc is loaded.
.bash_profile is loaded.
.bashrc is loaded.
.bash_profile is loaded.
.bashrc is loaded.
.bash_profile is loaded.
...
...
#=> 期待通り無限ループ。
^C$ ログアウト
$ vim .bash_profile
$ vim .bashrc
#=> sourceの行を削除して、無限ループにならないようにする。
#=> 最後に/etc/profileの挙動を確認する
$ echo 'echo etc/profile is loaded.' | sudo tee --append /etc/profile
#=> /etc/profile に書き込み。sudo権限が必要なため、このような書き方に
$ bash --login
etc/profile is loaded.
.bash_profile is loaded.
$ ログアウト
$ sudo vim /etc/profile
#=> 片付け。さっきのechoを消しておく
$ vim .bashrc .bash_profile
#=> 片付け。echoを消す

以上