解讀ubuntu下的環境變量

linux因爲是多任務多用戶的系統,因此就會存在不一樣的用戶會有須要其相應的環境變量,那麼,問題來了,究竟是把環境變量設置在哪一個地方比較好。由於在不少狀況下,許多任務須要設置環境變量才能執行。
linux環境下shell登錄時系統環境變量的讀取順序linux

  • /etc/profile
  • /etc/environment
  • ~/.profile
  • ~/.env

前面兩個是系統級的稱爲系統環境變量,後面的兩個是用戶級環境變量,系統的還包括/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

  • /etc/profile和/etc/profile.d/
    默認狀況下,Debian提供/etc/profile文件,這個文件用來設置$PATH變量($PATH一般用來聲明命令的搜索路徑),能夠當即生效。可是通常不建議在這裏設置環境變量,由於這裏是基礎文件包設置的環境變量,會隨着系統包設置的變化而變化。因此,通常建議是把全局用戶環境變量設置在/etc/profile.d/XXX.sh,看一下/etc/profile的部分代碼,這就是專門用來讀取這個文件夾下的全部腳本。
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文件
    首先是啓動/etc/profile等,下來是~/.pam_environment和~/.profile,若是是桌面環境的話,還會執行~/.bash_profile、 ~/.bash_login、 ~/.bashrc,在~/.profile的第一行有這樣一句話
# ~/.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

相關文章
相關標籤/搜索