linux因爲是多任務多用戶的系統,因此就會存在不一樣的用戶會有須要其相應的環境變量,那麼,問題來了,究竟是把環境變量設置在哪一個地方比較好。由於在不少狀況下,許多任務須要設置環境變量才能執行。
linux環境下shell登錄時系統環境變量的讀取順序linux
前面兩個是系統級的稱爲系統環境變量,後面的兩個是用戶級環境變量,系統的還包括/etc/bash.bashrc和/etc/default/locale,後面這個是用來設置系統的語言支持的,通常是不須要用戶設置的。用戶的還包括有 ~/.bashrc、~/.bash_profile、~./bash_login、~/.bash_logout和~/.pam_environmentshell
有以下實驗:
先將export LANG=zh_CN加入/etc/profile ,退出系統從新登陸,登陸提示顯示英文。將/etc/profile中的export LANG=zh_CN刪除,將LNAG=zh_CN加入/etc/environment,退出系統從新登陸,登陸提示顯示中文。
/etc/environment是設置整個系統的環境,而/etc/profile是設置全部用戶的環境,前者與登陸用戶無關,後者與登陸用戶有關。
系統應用程序的執行與用戶環境能夠是無關的,但與系統環境是相關的,因此當你登陸時,你看到的提示信息,好比日期、時間信息的顯示格式與系統環境的LANG是相關的,缺省LANG=en_US,若是系統環境LANG=zh_CN,則提示信息是中文的,不然是英文的。
若是同一個變量在用戶環境(/etc/profile)和系統環境(/etc/environment) 有不一樣的值那應該是以用戶環境爲準了。ubuntu
if [ -d /etc/profile.d ]; then for i in /etc/profile.d/*.sh; do if [ -r $i ]; then . $i fi done unset i fi
# ~/.profile: executed by the command interpreter for login shells. # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login # exists
也就是說若是~/.bash_profile 和~/.bash_login有任何一個文件存在,~/.profile都不會執行。~/.bash_login第一行有這麼一句bash
# ~/.bash_logout: executed by bash(1) when login shell exits.
其意思就是在登錄shell時纔會執行。
還有這麼一個文件~/.bashrc,看第一行.net
# ~/.bashrc: executed by bash(1) for non-login shells.
這是用來非交互時執行用戶環境變量的腳本。
最後,還有一個~/.bash_logout,這是用來在shell退出時執行的腳本。unix
綜上所述,咱們在設置環境變量的時候必定要規劃好其影響的範圍,尤爲要注意交互式shell和非交互式shell是會讀取不一樣的腳本從而造成不一樣的環境變量。
參考文檔
ubuntu官方文檔
Ubuntu系統環境變量詳解
Setting Session Environment Variables
Ubuntu Linux 環境變量PATH設置
理解 Linux/Unix 登陸腳本code