環境變量初始化與對應文件的生效順序
在登錄Linux系統並啟動一個 bash shell 時,默認情況下 bash 會在若干個文件中查找環境變量的設置,這些文件可統稱為系統環境文件,bash 檢查的環境變量文件的情況取決於系統運行 Shell 的方式,系統運行 Shell 的方式有 3 種。
(1)通過系統用戶登錄后默認運行的 Shell
(2)非登錄交互式運行 Shell
(3)執行腳本運行非交互是 Shell
1、登錄shell方式進入Linux
賬號和密碼——>/etc/profile(全局文件G1)——>/etc/profile.d/(全局腳本目錄F1)——> ~/.bash_profile(用戶文件U1)——> ~/.bashrc(用戶文件U2)——>/etc/bashrc(全局文件G2)
當用戶登錄 Linux 系統時,Shell 會作為登錄 Shell 啟動,此時的登錄 Shell 加載環境變量的順序如上圖。
用戶登錄系統后首先會加載 /etc/profile
全局環境變量文件,這是 Linux 系統上默認的 Shell 主環境變量文件,系統上每個用戶登錄都會加載這個文件。
當加載完 /etc/profile
文件后,才會執行 /etc/profile.d/
目錄下的腳本文件,這個目錄下的腳本文件由很多,例如:系統的字符集設置(/etc/sysconfig/i18n
)等,以便用戶登錄后即可運行腳本
之后開始運行 ~/.bash_profile
(用戶環境變量文件),在這個文件中,又會去找 ~/.bashrc
(用戶環境變量文件),如果有,則執行,如果沒有,則不執行,在 ~/.bashrc
文件中又會去找/etc/bashrc
(全局環境變量文件),如果有,則執行,如果沒有,則不執行。
2、非登錄Shell方式進入Linux
不需要輸入密碼的登錄及遠程 SSH 連接——> ~/.bashrc(用戶文件U2)——>/etc/bashrc(全局文件G2)
如果用戶的Shell 不是登錄時啟動的(比如手動敲下 bash 時啟動或者其他不需要輸入密碼的登錄及遠程 SSH 連接情況)那么這種非登錄 Shell 只會加載 ~/.bashrc
(用戶環境變量文件),並會去找 /etc/bashrc
(全局環境變量文件),因此如果希望在非登錄 Shell 下也可讀到設置的環境變量等內容,就需要將變量設定寫入 ~/.bashrc
或者 /etc/bashrc
,而不是 ~/.bash_profile
或/etc/profile
。
參考:
https://www.cnblogs.com/liuhedong/p/10356411.html
https://blog.csdn.net/abc_12366/article/details/87552848
https://blog.csdn.net/gshzh00/article/details/90286458
1、/etc/profile:系統配置文件,用戶登錄時讀取一次
2、/etc/bash.bashrc:(Ubuntu)系統配置文件,用戶登錄時讀取一次,每次打開一個新終端會話時讀取一次。
/etc/bashrc: (Centos)系統配置文件,用戶登錄時讀取一次,每次打開一個新終端會話時讀取一次。
3、~/.profile(~/.bash_profile、~/.bash_login):用戶配置文件,用戶登錄時讀取一次
4、~/.bashrc:用戶配置文件,用戶登錄時讀取一次,每次打開一個新終端會話時讀取一次
對於 ~/.bash_profile、~/.bash_login、~/.profile,如果終端綁定的是 bash,則按照我書寫的順序進行讀取(如果存在,就不繼續讀取)
1、系統配置文件作用於全局,而用戶配置文件僅針對當前登錄的用戶
2、先讀取系統配置文件,再讀取用戶配置文件,用戶配置文件的變量和表達式等都繼承自系統配置文件