それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bashrcの設定の読み込まれる順番

bashrcが反映されないなーと思ったので調べてみた。

すると、原因は

.profile が無かった。

なので

.profile にbashrc を読込設定を書いた

bashrc読込設定は/.profileに書いておけばいい。(Debianのデフォルトを貰ってきた→後述)

このとき、~/.profileに書いて大丈夫か心配になったので調べてみた。

設定に関するファイルの一覧

bash環境変数に関する設定は次のファイルに依って構成されていました。

/etc/profile
~/.bash_profile
~/.bash_login
~/.profile
/etc/bash.bashrc
~/.bashrc

どの順に読み込まれるか調べてみた。

各ファイルは自分のファイル名だけを出力する設定にして、その他を全部コメントアウトした

/etc/profile

を空っぽにしてEchoだけして読込順を調べることにした。

##
## 他を全てコメントアウト
##
echo "/etc/profile"

環境設定ファイルについても、同じようにファイル名をECHOするだけのを書いた。

読込順を調べた結果

SSHで接続したら、表示は次のようになりました。

takuya@KURO-BOX:~$ ssh localhost
Linux KURO-BOX 2.6.25.1-kurobox #1 Fri Dec 24 18:05:03 JST 2010 ppc

Last login: Sun Jan  2 20:42:21 2011 from 127.0.0.1
/etc/profile
~/.profile

(.bash_profile/.bash_login は消してあります。)

ログインシェルで実行されるのは~/.profile

ログイン時に設定される設定ファイル。ログインシェル(つまりログイン)で参照される設定はProfile系だけでした。

さらにbashを実行したらナニが読み込まれるか

Bashの設定ファイルは読み込まれてなかったので、さらにBashを起動しました。

-bash-3.2$ bash
/etc/bash.bashrc
~/.bashrc

bashrcが読み込まれました。

これはなぜか

ログインシェルは色々替わるので。そのままではBashrcを読み込みません。

ここまでのまとめ

ログイン時(SSH接続時)
 /etc/profile ~/.bash_profile

が読み込まれる。このファイルはそれぞれ

ファイル名 役割
/etc/profile システム全体設定
~/.profile ユーザー固有設定

になっていました。
この読込順は、さらに細かくなっています。

次の記事の図が参考になります。

bashの関連ファイルには、次のようなものがあります。

  • /etc/profile
  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile
  • ~/.bashrc
  • ~/.bash_logout

ユーザーがログインすると、まず/etc/profileを読み込み、次に~/.bash_profileを読み込みます。~/.bash_profileが存在しない場合は、~/.bash_loginを読み込みます。~/.bash_loginもない場合は~/.profileを読み込みます。~/.bash_logoutは、ログアウト時に読み込まれるファイルです。
http://www.atmarkit.co.jp/flinux/rensai/theory09/zu01s.gif

http://www.atmarkit.co.jp/flinux/rensai/theory09/theory09b.html

bash起動時

/etc/bash.bashrc ~/.bashrc

が、この順番で読み込まれました。このファイルはそれぞれ役割があり、profileと同じく、ユーザー・システム全体で分かれています。

ファイル名 役割
/etc/bash.bashrc システム全体bash設定
~/.bashrc ユーザー固有bash設定

になっていました。

bashrc を読み込むポイントはどこですか。

では、ログイン時にbashrcを読み込むにはどこに書くべきでしょうか。/etc/profileでしょうか。~/.profileでしょうか。
.profile でもイイですが、Bashでは~/.bash_profile に書きます。
bash がログインシェルで実行された場合 ~/.bash_profile を読み込みます。~/.profileは 他のシェル設定が書かれているかもしれないので、汚染を防ぐためだと考えられます。
bashしか使わないなら、.profileで問題ないのです。

~/.profileの内容

~/.profileのデフォルトに書かれています。

僕のDebianには次のように書かれていました。

# ~/.profile: executed by the command interpreter for login shells.
# ~/.profile は他のログインシェルも実行するファイルです。
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# この~/.profileは .bash_profileや .bash_login があれば、Bashは読みません
# see /usr/share/doc/bash/examples/startup-files for examples.
# さらに詳しい例は、次のファイルを呼んでみてください。/usr/share/doc/bash/examples/startup-files 
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

まとめ

bashしか使わないなら、~/.profileに設定書いちゃって構わない。
~/.profile に ~/.bashrc を呼び出す設定を書けばいい。