登錄外殼和非登錄外殼之間的區別?
我了解互動式外殼和非互動式外殼之間的基本區別。但是,登錄 shell 和非登錄 shell 究竟有什麼區別呢?
你能舉例說明非登錄互動式shell 的使用嗎?
登錄 shell 是您登錄互動式會話時在您的使用者 ID 下執行的第一個程序。登錄過程告訴 shell 像登錄 shell 一樣使用約定:傳遞參數 0,通常是 shell 執行檔的名稱,
-
前面帶有一個字元(例如-bash
,通常是bash
. 登錄 shell 通常讀取一個文件諸如設置環境變數之類的事情:/etc/profile
對於~/.profile
傳統的 Bourne shell,另外還有~/.bash_profile
bash †,zsh †/etc/zprofile
和csh 等。~/.zprofile``/etc/csh.login``~/.login
當您在文本控制台、通過 SSH 或使用登錄時
su -
,您將獲得一個互動式登錄shell。當您以圖形模式(在X 顯示管理器上)登錄時,您不會獲得登錄 shell,而是會獲得會話管理器或視窗管理器。很少執行非互動式登錄shell,但是當您使用顯示管理器登錄時,一些 X 設置會這樣做,以便安排讀取配置文件。其他設置(這取決於分發和顯示管理器)讀取
/etc/profile
並~/.profile
明確讀取,或者不讀取它們。獲得非互動式登錄 shell 的另一種方法是使用通過標準輸入傳遞的命令遠端登錄,該命令不是終端,例如ssh example.com <my-script-which-is-stored-locally
(與ssh example.com my-script-which-is-on-the-remote-machine
執行非互動式、非登錄 shell 的 相對)。當您在現有會話(螢幕、X 終端、Emacs 終端緩衝區、另一個內的 shell 等)中的終端中啟動 shell 時,您將獲得一個互動式的非登錄shell。該 shell 可能會讀取一個 shell 配置文件(
~/.bashrc
對於 bash 呼叫 asbash
,對於zsh,/etc/zshrc
對於csh ,如果設置為對於 mksh 等)。~/.zshrc``/etc/csh.cshrc``~/.cshrc``ENV``sh``$ENV``~/.mkshrc
當 shell 執行腳本或在其命令行上傳遞的命令時,它是一個非互動式、非登錄shell。這樣的 shell 一直在執行:當一個程序呼叫另一個程序時,它真的在 shell 中執行一個小腳本來呼叫另一個程序,這是很常見的。在這種情況下,一些 shell會讀取啟動文件(bash 執行由
BASH_ENV
變數指示的文件,zsh 執行/etc/zshenv
和~/.zshenv
打破東西。†我正在簡化一點,有關血腥細節,請參閱手冊。