Linux環境變量設置中配置文件分析(/etc/profile,~/.bashrc等)(轉)


說明:在研究中發現,對於不同版本的Linux系統有着不同的文件,但是總的入口是不變的/etc/profile,下面只是展示加載順序的研究過程,所以會有些系統沒有這個文件等問題。

一、配置文件與作用域

1、系統級別:

/etc/environment:在登錄時操作系統使用的文件,系統在讀取profile前,設置環境文件的環境變量。

/etc/profile:此文件為系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行。並從/etc/profile.d目錄的配置文件中搜集shell的設置。設定的變量(全局)的可以作用於任何用戶。

/etc/bashrc:為每一個運行bash shell的用戶執行此文件。當bash shell被打開時,該文件被讀取。(一般這個文件是在調用~/.bashrc時調用/etc/bashrc,但是有些系統不會這么調用)(有些系統為/etc/bash.bashrc,可能有關系,也可能沒關系)

2、用戶級別:

~/.bash_profile:每個用戶都可使用該文件輸入專用於自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次!默認情況下,它設置一些環境變量,執行用戶的.bashrc文件。(注意:該文件查找過程是依次查找~/.bash_profile、~/.bash_login、~/.profile三個配置文件,並且讀取第一個找到的並且可讀的文件為止。)

~/.pam_environment:當用戶第一次登錄時,該文件被執行。(有些系統為~/.env)(Ubuntu上有這個文件,參考:https://help.ubuntu.com/community/EnvironmentVariables

~/.bashrc:該文件包含專用於你的bash shell的bash信息,當登錄時以及每次打開新的shell時,該該文件被讀取。

~/.bash_logout:當每次退出系統(退出bash shell)時,執行該文件。

以上設定的變量(局部)只能繼承/etc/profile中的變量,他們是“父子”關系。

~/.bash_history:存儲用過的shell命令歷史記錄。應該是每次打開新的shell時就讀取。

3、/etc/profile和/etc/environment等各種環境變量設置文件的用處

先將export LANG=zh_CN加入/etc/profile,退出系統重新登錄,登錄提示顯示英文。

將/etc/profile中的export LANG=zh_CN刪除,將LNAG=zh_CN加入/etc/environment,退出系統重新登錄,登錄提示顯示中文。

用戶環境建立的過程中總是先執行/etc/profile然后在讀取/etc/environment。為什么會有如上所敘的不同呢?

應該是先執行/etc/environment,后執行/etc/profile。

/etc/environment是設置整個系統的環境,而/etc/profile是設置所有用戶的環境,前者與登錄用戶無關,后者與登錄用戶有關。

系統應用程序的執行與用戶環境可以是無關的,但與系統環境是相關的,所以當你登錄時,你看到的提示信息,象日期、時間信息的顯示格式與系統環境的LANG是相關的,缺省LANG=en_US,如果系統環境LANG=zh_CN,則提示信息是中文的,否則是英文的。

對於用戶的shell初始化而言是先執行/etc/profile,再讀取文件/etc/environment。對整個系統而言是先執行/etc/environment。這樣理解正確嗎?

/etc/enviroment->/etc/profile->$HOME/.profile->$HOME/.env(如果存在,有些系統是.pam_environment)

/etc/profile是所有用戶的環境變量。

/etc/enviroment是系統的環境變量。

登陸系統時shell讀取的順序應該是:/etc/profile->/etc/enviroment->$HOME/.profile->$HOME/.env

原因應該是用戶環境和系統環境的區別了,如果同一個變量在用戶環境(/etc/profile)和系統環境(/etc/environment)有不同的值那應該是以用戶環境為准了。

4、說明:

~/.bash_profile是交互式login方式進入bash運行的。

~/.bashrc是交互式non-login方式進入bash運行的。

通常二者設置大致相同,所以通常前者會調用后者。 

基本上以上的配置文件一個標准Linux的加載時所持有的,但是當安裝了一些第三方軟件或者美化工具時會加入一些特定的文件作為環境變量文件去設置這些第三方軟件來達到目的,所以這里應該注意不要被這些文件擾亂了分析思路。

二、在登錄Linux時要執行文件的過程如下:

在剛登錄Linux時,首先啟動/etc/profile文件,然后再啟動用戶目錄下的~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一個(根據不同的linux操作系統的不同,命名不一樣),執行的順序為:~/.bash_profile、 ~/.bash_login、 ~/.profile。

如果~/.bash_profile文件存在的話,一般還會執行~/.bashrc文件。

因為在 ~/.bash_profile文件中一般會有下面的代碼:

if [ -f ~/.bashrc ] ; then
. ./bashrc
fi

~/.bashrc中,一般還會有以下代碼(有些系統沒有這個,且不會調用/etc/bashrc):

if [ -f /etc/bashrc ] ; then
. /etc/bashrc
fi

所以,~/.bashrc會調用/etc/bashrc文件。最后,在退出shell時,還會執行~/.bash_logout文件。

執行順序為:/etc/profile->(~/.bash_profile|~/.bash_login|~/.profile)->~/.bashrc->/etc/bashrc->~/.bash_logout

三、shell登錄模式及其相應配置文件的關系 

當啟動shell時,它將運行啟動文件來初始化自己。具體運行哪個文件取決於該shell是登陸shell還是非登陸shell的交互方式(比如通過bash),又或者是一個非交互式shell(用來執行shell腳本)。要執行啟動文件中的命令,用戶就必須具備讀的權限,而一般的Linux發行版本都會把對應的命令放在一些啟動文件中。

 1、交互式登陸(login)shell

交互式登陸shell指的是當用戶登錄系統時所用的那個shell(可以默認指定,如bash --login)。登錄shell將查找幾個不同的啟動文件來處理其中的命令,bash shell處理文件的順序如下:

/etc/profile:shell首先執行/etc/profile中的命令。設置這個文件后,可以為系統內所有的bash用戶建立默認的特征(不同版本的Linux在此文件放置的命令不盡相同)。

~/.bash_profile、~/.bash_login、~/.profile:然后shell依次查找這些文件,並執行它找到的第一個文件中的命令。可以將命令放在這些文件中,以重寫/etc/profile文件中默認的設置。

~/.bash_logout:當用戶注銷時,bash執行文件~/.bash_logout中的命令,這個文件包含了退出會話時執行的清理命令,如:刪除臨時文件等。

2、交互式非登陸(non-login)shell

交互式非登陸shell指的是如果啟動了一個bash shell而沒有等錄系統(如在CLI 提示符中鍵入bash),則啟動了一個交互式非登錄shell。交互式非登錄shell並不執行前面提到的啟動文件中的命令,然而交互式非登陸shell從登錄shell繼承了由這些啟動文件設置的shell變量。

/etc/bashrc:盡管不是通過bash直接調用,但許多~/.bashrc文件調用/etc/bashrc。這種設置使得超級用戶可以為系統內的非登陸shell建立默認屬性。

~/.bashrc:交互式非登陸shell執行~/.bashrc文件中的命令,而登陸shell的啟動文件(如~/.bash_profile)通常會運行這個文件。這樣,登陸shell和非登陸shell都可以運行~/.bashrc中的命令了。

3、非交互式shell

非交互式shell指的是以shell script(腳本)方式運行(也就是.sh結尾的文件)。在這種模式在運行時shell並不與用戶進行交互(除非在運行時需要用戶指定運行參數),而是讀取存放在文件中的命令並執行它們。當它讀到文件的結尾,shell也就終止了。這些shell從登陸時就繼承了由這些啟動文件設置的shell變量。

BASH_ENV:非交互式shell查找環境變量BASH_ENV(或者當作為sh調用時為的ENV),並執行由該變量命名的文件中的命令。

4、測試:

在~/.bash_profile中設置如下變量:

lshell="login shell will see this message"

分別啟動一個交互式non-login shell和交互式login shell,查看lshell變量:

#注意:$不是命令
$ bash $ echo $lshell $ exit exit $ bash --login $ echo $lshell login shell will see this message $ exit logout

可見non-login shell並沒有讀取~/.bash_profile,login shell讀取了,與上面的描述相符。

 

參考:

http://baike.baidu.com/item/%E4%BA%A4%E4%BA%92%E5%BC%8F%E7%99%BB%E5%BD%95(交互登錄方式)

http://www.cnblogs.com/zengkefu/p/5492532.html(交互登錄方式)

http://www.cnblogs.com/zhaoyl/archive/2012/07/07/2580744.html(交互登錄方式轉自此篇文章)

http://blog.csdn.net/li19236/article/details/41486587(交互登錄方式)

http://www.cnblogs.com/qcly/p/3273373.html(交互登錄方式測試轉自此篇文章)

https://help.ubuntu.com/community/EnvironmentVariables(Ubuntu環境變量設置)

http://www.cnblogs.com/liduanjun/p/3536993.html(配置文件說明轉自此篇文章)

http://www.cnblogs.com/xiehongfeng100/p/4969477.html(配置文件說明)

http://blog.chinaunix.net/uid-354915-id-3568853.html(配置文件說明)

http://www.cnblogs.com/mengyan/archive/2012/09/04/2669894.html(配置文件說明)

http://www.linuxidc.com/Linux/2015-01/111459.htm(配置文件說明)

http://www.cnblogs.com/yymn/p/5698623.html(配置文件說明)

http://blog.sina.com.cn/s/blog_8795b0970101f1f9.html(配置文件說明)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM