標籤:style color 使用 io strong 檔案 ar 問題
介紹之前先思考一個問題:有時我們通過su命令切換使用者後,卻發現並沒有進入該使用者的shell環境。這是為什嗎?
login shell:取得bash時需要完整的登入流程。就是說通過輸入帳號和密碼登入系統,此時取得的shell稱為login shell
non-login shell:取得sbash介面的方法不需要重複登入的舉動。如以X Window登入登入linux後,再以X的圖形介面啟動終端機,此時那個終端機並沒有需要輸入帳號和密 碼,那個bash環境就是non-login shell。在原本的bash環境下再次執行bash命令,同樣也沒有輸入帳號密碼就進入新的bash環境(前一個bash的子進程),新的bash也是non-login shell。
那麼,到底兩者的區別在哪裡?
login shell:此種方式登入時,shell會重新讀取/etc/profile和~/.bash_profile來應用新的環境變數。
non-login shell:此時shell不會讀取/etc/profile和~/.bash_profile,而是讀取~/.bashrc來應用新的環境變數。話說標題是區別與影響,影響的東西自然源於區別。回到文章開頭的問題,su切換使用者沒有擷取使用者的環境(當時用的命令是"su xxoo",這裡xxoo為要切換的使用者,以root身份執行的此命令),看來問題就在這倆login方式,根據現象我們可以判斷 su xxoo執行了non-login shell。
為了驗證上面的判斷,我們查看了su命令的簡單協助:
[[email protected] ~]# su --help
Usage: su [OPTION]... [-] [USER [ARG]...]
Change the effective user id and group id to thatof USER.
-, -l,--login make the shell a login shell
很明顯,我的判斷是正確的,預設情況下是執行的non-login shell,因為要執行login shell需要在su後面添加參數"-"或"-l"或"--login"。所以要在su之後擷取使用者的環境變數,需要執行類似"su - xxoo"之類的命令。
另外還有三個提示:
PS1:bash在讀取/etc/profile後會讀取各賬戶的個人設定檔,所讀取的個人設定檔主要有三個:~ /.bash_profile,~/.bash_login,~/.profile。其實bash在讀取的時候只會讀取的上述三個檔案的其中一個,而讀取 的順序則就是上面的順序。也就是說bash會依次尋找上述三個個人設定檔,且找到一個後,後續的檔案便不再讀取。
PS2:當以non-login shell登入時,如果希望擷取使用者的環境變數,執行"source ~/.bash_profile"即可(.bash_profile根據情況也可能是.bash_login或.profile),而其中source可以用小數點替換,即"source ~/.bash_profile"等價於". ~/.bash_profile"。source命令的解釋可以自行搜尋。
PS3:其實有的linux發行版的login shell也會讀取.bashrc檔案,如Fedora11中執行 "vim ~/.bash_profile"會發現 "if [ -f ~/.bashrc ]; then . ~/.bashrc fi"。這裡就使用了PS2的提到的用小數點替換source特性,即在./bash_profile會讀取執行.bashrc檔案