.bash_profile と .bashrc は何が違うの?使い分けを覚える

普段 Windows で GitBash を起動して Bash しか使わない人とか、Mac OSX デフォルトのターミナルしか触らない人とかは、これらの違いやそれによる利便を感じることはないと言える。自分も今のところ、「分かれていることで便利だ」と感じるようなことはない。

ただ、世間一般的にどういう風に捉えられているのか、自分はどう使い分けておくといいのかを整理しておこう。

動きを整理する

まずは .bash_profile.bashrc の中身を以下のようにしてみることで、それぞれのファイルの動きを整理してみよう。

# .bash_profile
echo This is .bash_profile
# .bashrc を読み込む
test -r ~/.bashrc && . ~/.bashrc
# .bashrc
echo This is .bashrc

このような状態で、例えば GitBash を、例えばターミナル.app を起動してみる。するとどうなるか。

This is .bash_profile
This is .bashrc
$

このように、.bash_profile.bashrc を読み込もうとしているので、このように実行されている。ちなみに、.bash_profile 内に .bashrc を読み込むコマンドを書かないと、.bashrc は読み込まれない。

ではターミナルを起動後、bash コマンドで新たに Bash を起動したらどうなるか。

$ bash
This is .bashrc
$

今度は .bash_profile は読み込まれておらず、.bashrc だけが読み込まれていることが分かる。

よく云われている、

とはこういう動作のことを指している。

だから、例えば GUI 環境を持つ Linux マシンにログインして、画面上からターミナルを起動すると、.bash_profile は実行されず、.bashrc だけが実行される。Linux に既にログインしているからだ。

.bash_profile はログイン時に1回だけ実行される

さて、じゃあ .bash_profile には何を書くのが良いのだろうか。答えは、環境変数を書くものとして扱うのが良い。

環境変数とは、export コマンドで宣言する変数だ。この環境変数はプロセス間で共有されるので、シェルを起動するたびに何度も呼ぶ必要がない。

だから、.bash_profile は環境変数を書いたら、さっさと .bashrc を読み込んで終わらせてしまうだけの、普段はあんまりカスタマイズしないところとしておくと良いだろう。

.bashrc はシェルを起動するたびに実行される

一方、.bashrc はシェルを起動するたびに実行されるので、環境変数ではない変数だとか、エイリアスとか、独自のシェル関数を宣言しておくと良い。

.bash_profilealias コマンドでエイリアスを登録してしまうと、ターミナルを起動後に bash コマンドで新たなシェルを起動したときに、.bash_profile に書いた alias は読み込まれない。エイリアスは .bashrc に書いた方が良い。

エイリアスなら、環境変数よりは色々弄る機会が多いと思うので、「普段は .bashrc に書く」と覚えてしまって良いだろう。

参考