no login shell和login shell在啓動和退出時會執行不同的腳本文件從而影響shell中的環境變量,本文根據bash的文檔描述了兩種shell啓動時自動執行的腳本文件的區別。
什麼是nologin shell和login shell?
按照bash文檔的說法,login shell是第0個參數以-
開頭或者有一個參數爲-login
的shell。
A login shell is one whose first character of argument zero is a -, or one started with the --login option.
根據該定義,我們可以使用bash --login
啓動一個login shell或者通過echo $0
的輸出結果是否以-
開頭來判斷一個shell是否爲login shell。
經過我的測試,通過圖形界面啓動的終端爲no login shell, 而通過ssh遠程連接得到的shell爲login shell。
爲什麼要關注是login shell還是no login shell?
區分login shell和no login shell的主要原因是它們啓動和退出時自動執行的腳本不同。
login shell
對於login shell其啓動時自動執行的腳本文件順序如下
首先執行/etc/profile
再執行~/.bash_profile, ~/.bash_login, ~/.profile中第一個存在的腳本(按順序搜索,只會執行其中一個)
如果shell啓動時添加了--noprofile
選項則不會執行上述文件。在login shell退出時,會執行~/.bash_logout
。
no login shell
對於no login shell,啓動時會執行/etc/bash.bashrc
和~/.bashrc
,如果shell啓動時添加了--norc
選項則不會執行上述文件,如果添加了--rcfile <filename>
選項則會執行指定的filename文件,也不會執行上述文件。no login shell退出時不會自動執行腳本文件。
總結
login shell和no login shell啓動時執行的腳本文件是完全不同的,因此,運行環境初始化腳本需要合理配置才能讓login shell和no login shell都能執行,同時也可以爲login shell和no login shell配置不同的運行環境初始化腳本。