無論是否是互動式,是否是登入式,Bash Shell 在啟動時總要設定其執行環境,例如初始化環境變數、設定命令提示字元、指定系統命令路徑等。這個過程是通過載入一系列組態檔完成的,這些組態檔其實就是 Shell 指令碼檔案。
與 Bash Shell 有關的組態檔主要有 /etc/profile、~/.bash_profile、~/.bash_login、~/.profile、~/.bashrc、/etc/bashrc、/etc/profile.d/*.sh,不同的啟動方式會載入不同的組態檔。
~
表示使用者主目錄。*
是萬用字元,/etc/profile.d/*.sh 表示 /etc/profile.d/ 目錄下所有的指令碼檔案(以.sh
結尾的檔案)。
登入式的 Shell
Bash 官方文件說:如果是登入式的 Shell,首先會讀取和執行 /etc/profiles,這是所有使用者的全域性組態檔,接著會到使用者主目錄中尋找 ~/.bash_profile、~/.bash_login 或者 ~/.profile,它們都是使用者個人的組態檔。
不同的 Linux 發行版附帶的個人組態檔也不同,有的可能只有其中一個,有的可能三者都有,筆者使用的是 CentOS 7,該發行版只有 ~/.bash_profile,其它兩個都沒有。
如果三個檔案同時存在的話,到底應該載入哪一個呢?它們的優先順序順序是 ~/.bash_profile > ~/.bash_login > ~/.profile。
如果 ~/.bash_profile 存在,那麼一切以該檔案為準,並且到此結束,不再載入其它的組態檔。
如果 ~/.bash_profile 不存在,那麼嘗試載入 ~/.bash_login。~/.bash_login 存在的話就到此結束,不存在的話就載入 ~/.profile。
注意,/etc/profiles 檔案還會巢狀載入 /etc/profile.d/*.sh,請看下面的程式碼:
for i in /etc/profile.d/*.sh ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
同樣,~/.bash_profile 也使用類似的方式載入 ~/.bashrc:
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
非登入的 Shell
如果以非登入的方式啟動 Shell,那麼就不會讀取以上所說的組態檔,而是直接讀取 ~/.bashrc。
~/.bashrc 檔案還會巢狀載入 /etc/bashrc,請看下面的程式碼:
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi