noob

底辺オペレーターのメモ

.bash_profile とか .bashrc とかbash起動ファイルの読み込み順

このへんの読み込み順ってすぐ忘れてしまうのでメモ.

シェル

  • OSのユーザーのためにインタフェースを提供するソフトウェアでカーネルのサービスへのアクセスを提供する.
  • OSの内部(カーネル)とユーザーの間にある外殻(シェル)であることから,このように呼ばれる.

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

参考