Shell組態檔(指令碼)的載入

2020-07-16 10:04:47
無論是否是互動式,是否是登入式,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