介紹以前先思考一個問題:有時咱們經過su命令切換用戶後,卻發現並無進入該用戶的shell環境。這是爲何?linux
login shell:取得bash時須要完整的登陸流程。就是說經過輸入帳號和密碼登陸系統,此時取得的shell稱爲login shellshell
non-login shell:取得sbash接口的方法不須要重複登陸的舉動。如以X Window登陸登陸linux後,再以X的圖形界面啓動終端機,此時那個終端機並無須要輸入帳號和密 碼,那個bash環境就是non-login shell。在本來的bash環境下再次執行bash命令,一樣也沒有輸入帳號密碼就進入新的bash環境(前一個bash的子進程),新的bash也是non-login shell。vim
那麼,到底二者的區別在哪裏?bash
login shell:此種方式登陸時,shell會從新讀取/etc/profile和~/.bash_profile來應用新的環境變量。spa
non-login shell:此時shell不會讀取/etc/profile和~/.bash_profile,而是讀取~/.bashrc來應用新的環境變量。話說標題是區別與影響,影響的東西天然源於區別。回到文章開頭的問題,su切換用戶沒有獲取用戶的環境(當時用的命令是"su xxoo",這裏xxoo爲要切換的用戶,以root身份執行的此命令),看來問題就在這倆login方式,根據現象咱們能夠判斷 su xxoo執行了non-login shell。接口
爲了驗證上面的判斷,咱們查看了su命令的簡單幫助:進程
[root@isayme ~]# su --help
Usage: su [OPTION]... [-] [USER [ARG]...]
Change the effective user id and group id to that of 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文件