Bash Startup File
Bashの起動時読み込みファイルについて記憶が曖昧だったのでしっかりまとめることにした。
用語・ファイル一覧
最初に登場する用語とファイルを整理する。シェルの起動時ファイルは以下の3種類に分類される。
- ログインシェル:PCのログイン時のシェル。GUIログイン時も内部的には起動。
- 対話的非ログインシェル:ログイン時以外で,対話的にコマンドを実行するシェル。例:GUIログイン時にターミナルを起動。
- 非対話的シェル:非対話的にコマンドを実行するシェル。例:シェルスクリプトの実行時。
また,bashの起動時と終了時に関連する設定ファイルをbashの起動時・終了時ファイルに示した。この表からわかるように一部ディストリビューション特有の設定ファイルが存在する。
ファイル | 説明 |
/etc/profile | システム全体用の初期化ファイル |
/etc/bash.bashrc | システム全体用の初期化ファイル(Debian系のみ) |
/etc/bash.bash.logout | システム全体用のログインシェル終了時ファイル(Debian系のみ)。 |
/etc/bash.bash_logout | システム全体用のログインシェル終了時ファイル(RedHat系のみ)。 |
/etc/bashrc | 既定の~/.bashrcでこのファイルを実行している。 |
~/.bash_profile | 個人用の初期化ファイル。 |
~/.bash_login | 個人用のログイン時初期化ファイル。 |
~/.bashrc | 対話シェルの個人用の起動ファイル |
~/.bash_logout | 個人用のログインシェル終了時ファイル。 |
この表でDebian系とはDebian,Ubuntu,Linux Mintなどを指し,RedHat系とはRedHat,CentOS,Scientific Linuxなどを指す。
以降から上記3分類ごとの起動時ファイルの実行順について記す。
ログインシェル(interactive login shell, or with –login)
- /etc/profileが存在すれば実行。
- 以下の3ファイルをこの順番で探し,最初に見つかったファイルを実行(但し,Ubuntuは~/.profileしか探さない)。
- ~/.bash_profile
- ~/.bash_login
- ~/.profile
- ログインシェルの終了時に,/etc/bash.bash.logoutが存在すれば実行(Debian系のみ)。
- ログインシェルの終了時に,~/.bash_logoutが存在すれば実行。
- ログインシェルの終了時に,/etc/bash.bash_logoutが存在すれば実行(RedHat系のみ)。
設定ファイルを読み込みたくなかったら–noprofileオプションを使う。
これらのファイルはログイン時やログアウト時に1回だけ実行される。特に理由がなければ編集する必要はない。
bashの設定ファイルとして知られる~/.bashrcはログイン時には直接読み込まれない。これらのprofileやloginとつくファイル内で,~/.bashrcを読み込むように設定されている。また,既定の~/.bashrcでは/etc/bashrcを読み込むように設定されている。
bashは大部分のLinuxのログインシェルとして使われているので,この設定は重要である。例えば,GUIで操作する場合においても,ここでプログラムのPATHが通っているかどうかでDASHなどのGUIの検索画面に表示されるかどうかが変わってくる。また,環境変数の設定もGUIでのプログラム起動などで効いてくる。
なお,Ubuntuは~/.bash_profileと~/.bash_loginは無視している。そのため,ログイン時の設定をするならば~/.profileにしたほうがよい。
対話的非ログインシェル(Interactive non-login shell)
- /etc/bash.bashrcが存在すれば実行(Debian系のみ)。
- ~/.bashrcが存在すれば実行。
- /etc/bashrcが存在すれば実行(RedHat系のみ)。
–norcオプションを使えば読み込まない。–rcfile <file>でファイルを指定すれば~/.bashrcの代わりに<file>を実行する。
bashを起動すると毎回実行されるのが~/.bashrcファイルである。基本的にはこのファイルにbashの設定を書くことになる。
非対話的シェル(non-interactively)
シェルスクリプトの実行時など非対話的に起動するとき,BASH_ENV変数(既定値はなし)に設定されているファイルを実行する。以下のコマンドと同じように動作する。
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
もし,–loginオプション付きで非対話シェルが呼び出されたらログインシェルと同じように起動時ファイルを実行する。
BASH_ENV変数に自分で設定ファイル指定することで,シェルスクリプトの実行時の挙動を設定できる。シェルスクリプトの挙動が変わってしまう危険性があるので,基本的にはBASH_ENV変数は設定しないほうがよい。
参考情報
1と2を特に参考にした。
- UbuntuデスクトップでPATHの設定は、~/.bashrc か ~/.bash_profile か ~/.profile のどれに書けばよいのか? – 部屋の中にも一年 http://itiut.hatenablog.com/entry/2013/07/07/114143
- bashの設定ファイルの読み込みが複雑すぎて混乱する – ぱせらんメモ http://d.hatena.ne.jp/pasela/20090209/bash
- Bourne-Again SHell manual – GNU Project – Free Software Foundation https://www.gnu.org/software/bash/manual/
- Ubuntu日本語フォーラム / .bash_profile https://forums.ubuntulinux.jp/viewtopic.php?pid=6667
- configuration – When is /etc/bash.bashrc invoked? – Unix & Linux Stack Exchange http://unix.stackexchange.com/questions/187369/when-is-etc-bash-bashrc-invoked