理解Linux環境變數及配置檔案執行順序
每個使用者都有自己專屬的執行環境,這個環境是由一組變數所定義,這些變數稱之為環境變數。使用者可以修改環境變數以滿足自己的要求。
設定環境變數:$export NAME="HELLOWORLD" ( 臨時變數,重啟系統將失效)
顯示環境變數:$echo $NAME
env 命令檢視當前使用者的環境變數
如果要想把環境保存於系統,以便下次開機還能生效就必須配置到以下檔案中:
/etc/profile;~/ .bash_profile;~/ .bash_login;~/.profile;~/ .bash_logout;
/etc/bash.bashrc;~/.bashrc;
那麼他們之間有什麼樣的區別呢?
首先理解一下概念:
login shell:使用者通過終端登入憑藉使用者名稱和密碼登入控制檯的動作是login shell,也就是說最終會呼叫login命令的操作都可稱之為login shell。
non-login shell:使用者在圖形介面啟動一個terminal,或者執行/bin/bash,/usr/bin/bash都屬於non-login shell。
使用者登入時,會讀取login shell。讀取檔案的順序是:
- /etc/profile
- ~/.bash_profile
- ~/.bash_login
- ~/.profile
即: /etc/profile 是必須要執行的,然後後面3個,按照順序誰存在就執行誰,然後後面的就不會再執行。其邏輯可用程式碼表示為:
- execute /etc/profile
- IF ~/.bash_profile exists THEN
- execute ~/.bash_profile
- ELSE
- IF ~/.bash_login exist THEN
- execute ~/.bash_login
- ELSE
- IF ~/.profile exist THEN
- execute ~/.profile
- END IF
- END IF
- END IF
注意:1. /etc/profile 是全域性配置,任意一個使用者登入的時候都會載入該配置檔案內容,而~開頭的幾個配置檔案只是在相應使用者登入的時候才會載入
2. 上面幾個檔案只會在使用者登入的時候載入一次,在使用者重新登入之前,即使配置檔案被修改了,也不會在自動重新整理
退出互動控制檯,會執行~/.bash_logout :
Java程式碼- IF ~/.bash_logout exists THEN
- execute ~/.bash_logout
- END IF
對於/etc/bash.bashrc 和~/.bashrc,是在non login shell 啟動時執行,也就意味著在圖形介面每開啟一次terminal,就會讀取一次該檔案。
/etc/bash.bashrc是每個使用者都有效的,而~/.bashrc是隻對對應使用者有效。
- IF ~/.bashrc exists THEN
- execute ~/.bashrc
- END IF
在很多Redhad發行版中和Ubuntu發行版中,如果.bashrc存在於home目錄,它將從.bash_profile或.profile中執行。即執行.bash_profile或.profile配置時會同時執行.bashrc配置檔案內容。
下面是.bash_profile或.profile中有的程式碼
# Run .bashrc if it exists
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
總的來說,配置檔案分兩種:1. login shell 在登入時即生效
2. non login shell 在每次開啟終端時都會生效
同時 login shell 又分為登入時和退出時兩種情況。
注意: 1. /etc/environment是整個系統的環境,而/etc/profile是所有使用者的環境,前者啟動系統後就會去讀取該檔案,後者只有在使用者登入的時候才去讀取
2. 當用戶修改配置檔案之後,系統不會自動更新,因此使用者可以採用source指令 或 .指令(“點”指令)來手動重新整理,操作方法為:
source 你要重新整理的檔案路徑 或 . 你要重新整理的檔案路徑
但是,在終端執行該指令時,只會對當前終端有效,對於其他所有終端無效。
因此,修改profile類配置檔案,如/etc/profile、~/.profile之後,最有效的辦法還是使用者退出再登入。
而bashrc類配置檔案由於跪在每次重開終端時就遊戲,所以修改配置後關閉終端再重開即可。
本人現在是有/etc/profile;~/.profile;~/ .bash_logout;
/etc/bash.bashrc;~/.bashrc;
因為比較好記憶,兩個profile,兩個bashrc,一個bash_logout