1. 程式人生 > >ubuntu中環境變數檔案/etc/profile、.profile、.bashrc、/etc/bash.bashrc之間的區別和聯絡(轉)

ubuntu中環境變數檔案/etc/profile、.profile、.bashrc、/etc/bash.bashrc之間的區別和聯絡(轉)

寫在前面:不同的發行版裡面檔案的命名可能有所不同,如有的發行版etc目錄下有bashrc,有的發行版下面是bash.bashrc。這個根據每個人不同的發行版注意下具體的檔名稱。

/etc/profile:此檔案為系統的每個使用者設定環境資訊,當用戶第一次登入時,該檔案被執行.並從/etc/profile.d目錄的配置檔案中搜集shell的設定.所以如果你有對/etc/profile有修改的話必須得重啟你的修改才會生效,此修改對每個使用者都生效。可以通過命令source /etc/profile立即生效

/etc/bashrc或/etc/bash.bashrc:為每一個執行bash shell的使用者執行此檔案.當bash shell被開啟時,該檔案被讀取.如果你想對所有的使用bash的使用者修改某個配置並在以後開啟的bash都生效的話可以修改這個檔案,修改這個檔案不用重啟,重新開啟一個bash即可生效。

~/.bash_profile或~/.profile :每個使用者都可使用該檔案輸入專用於當前使用者使用的shell資訊,當用戶登入時,該檔案僅僅執行一次!預設情況下,他設定一些環境變數,執行使用者的.bashrc檔案.
此檔案類似於/etc/profile,也是需要需要重啟才會生效,/etc/profile對所有使用者生效,~/.bash_profile只對當前使用者生效。

~/.bashrc:該檔案包含專用於你的bash shell的bash資訊,當登入時以及每次開啟新的shell時,該檔案被讀取.(每個使用者都有一個.bashrc檔案,在使用者目錄下)。此檔案類似於/etc/bashrc或/etc/bash.bashrc,不需要重啟生效,重新開啟一個bash即可生效,  /etc/bashrc或/etc/bash.bashrc對所有使用者新開啟的bash都生效,但~/.bashrc只對當前使用者新開啟的bash生效。

另外,/etc/profile中設定的變數(全域性)的可以作用於任何使用者,而~/.bashrc等中設定的變數(區域性)只能繼承/etc/profile中的變數,他們是"父子"關係.


要搞清bashrc與profile的區別,首先要弄明白什麼是互動式shell和非互動式shell,什麼是login shell 和non-login shell。
互動式模式就是shell等待你的輸入,並且執行你提交的命令。這種模式被稱作互動式是因為shell與使用者進行互動。這種模式也是大多數使用者非常熟悉的:登入、執行一些命令、簽退。當你簽退後,shell也終止了。 shell也可以執行在另外一種模式:非互動式模式。在這種模式下,shell不與你進行互動,而是讀取存放在檔案中的命令,並且執行它們。當它讀到檔案的結尾,shell也就終止了。
bashrc與profile都用於儲存使用者的環境資訊,bashrc用於互動式non-loginshell,而profile用於互動式login shell。

互動式的:顧名思義,這種shell中的命令時由使用者從鍵盤互動式地輸入的,執行的結果也能夠輸出到終端顯示給使用者看。例如我們平常在終端輸入的cd命令、vi命令、mv等都屬於互動式的。

非互動式的:這種shell可能由某些自動化過程啟動,不能直接從請求使用者的輸入,也不能直接輸出結果給終端使用者看。通常我們寫的shell指令碼都是非互動式的,通過sh 直接執行該指令碼檔案。

login的:意思是這種是在某使用者由/bin/login登陸進系統後啟動的shell,跟這個使用者繫結。這個shell是使用者登陸後啟動的第一個程序。login程序在啟動shell時傳遞第0個引數指明shell的名字,該引數第一個字元為"-",指明這是一個login shell。比如對bash而言,啟動引數為"-bash"。當bash以login shell啟動時,它會執行/etc/profile中的命令,然後/etc/profile呼叫/etc/profile.d目錄下的所有指令碼;然後執行~/.profile,~/.profile呼叫~/.bashrc,最後~/.bashrc又呼叫/etc/bash.bashrc。
要識別一個shell是否為login shell,只需在該shell下執行echo $0:
# echo $0
如果輸出為該shell名字,加上一個'-'字首,則說明該shell為login shell。例如-bash,-su等等。實驗一下,在本人的Ubuntu系統下,開啟Terminal,輸入echo $0,得到的是"bash",說明這不是一個login shell。而切換到root使用者下,執行同樣命令,得到了"-su"的結果,說明由su登入的為login shell。


非login的:不需login而由某些程式啟動的shell。傳遞給shell的引數,是沒有'-'字首的。還以Bash為例,當以非login方式啟動時,它會呼叫~/.bashrc,隨後~/.bashrc中呼叫/etc/bashrc,最後/etc/bashrc呼叫所有/etc/profile.d目錄下的指令碼。這個有興趣的可以開啟這些檔案看一看。非login的shell主要包括以"#su","#su USERNAME"啟動的shell,和圖形終端(例如Ubuntu的Terminal),執行的指令碼等等。識別非login的shell方法還是執行#echo $0命令,得到的結果如果沒有'-'字首,即為非login的。