bashの設定ファイル

bashは、いつ・どんな風に設定ファイルを読み込んで、設定されるのだろうか?結構悩んでしまった。調べてみた。

  • 日本語表示の設定などは、bashでなく、ターミナル側の設定なのだろうか?
# ターミナルのタブやウィンドウを開いた時(ログインした時)、sshログインした時、読み込まれる
/etc/profile

# ログイン後にbashコマンドを起動した時、読み込まれる
#   /etc/profileのスクリプトによって、読み込まれる設定になっている
/etc/bashrc

# ターミナルのタブやウィンドウを開いた時(ログインした時)、sshログインした時、読み込まれる
#   左側のファイルが存在しない時、右側のファイルが読み込まれる
~/.bash_profile || ~/.bash_login || ~/.profile

# ログイン後にbashコマンドを起動した時、suでユーザーを変更した時、読み込まれる
~/.bashrc
  • つまり、~/.bashrcだけが、ログイン後にbashコマンドで起動した時、suでユーザーを変更した時、に読み込まれる。
    • それ以外は、ログイン時に読み込まれる。
    • 今のところ、どちらも同じ設定で問題ない。
  • そこで、追加する設定はすべて~/.bashrcに書いて、~/.bash_profileのスクリプトで~/.bashrcを読み込む設定にした。
# ---------- ~/.bash_profile ----------
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi
  • ちなみに、/etc ディレクトリの設定ファイルは、以下のようになっていた。(コメントを追記した)
# ---------- /etc/profile ----------
# System-wide .profile for sh(1)

# $ echo `/usr/libexec/path_helper -s`を試してみると、以下のように展開された
# PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin"; export PATH;
if [ -x /usr/libexec/path_helper ]; then
	eval `/usr/libexec/path_helper -s`
fi

# 変数BASH-noが、"no"でなければ...
# 読み取り可能なら、/etc/bashrcを読む
if [ "${BASH-no}" != "no" ]; then
	[ -r /etc/bashrc ] && . /etc/bashrc
fi
# ---------- /etc/bashrc ----------
# System-wide .bashrc file for interactive bash(1) shells.
# プロンプト文字列が設定されていなければ...
# 	bashが対話モード(ターミナルの中で)で起動している場合、$PS1にはデフォルト値"\s-\v\$ "が設定されている。
# 	bashが非対話モード(シェルスクリプトの中で)で起動している場合、$PS1には何も設定されていない。
# 	つまり、非対話モード(シェルスクリプトの中で)で起動している場合、何もせずに戻るのだ。
if [ -z "$PS1" ]; then
   return
fi

# プロンプト文字列を設定する
PS1='\h:\W \u\$ '
# Make bash check its window size after a process completes
# 端末の画面サイズを自動認識する
shopt -s checkwinsize


ssh接続時の注意

$ ssh zari@zari-MacBook.local
zari-MacBook:~ zari$ echo $PATH
#ssh接続の対話モードでは~/.bash_profileの設定が読み込まれる
$ ssh zari@zari-MacBook.local 'echo $PATH'
#ssh接続の非対話的な環境では~/.bashrcの設定が読み込まれる

参考ページ

たいへん参考になりました!感謝です!