Shell

為什麼在“非登錄”外殼上使用“登錄”外殼?

  • July 27, 2020

我對nix 系統中的點文件有基本的了解。*但是我仍然對Login Shell 和 Non-Login Shell 之間的差異感到很困惑?

一堆不同的答案(包括多個重複)已經解決了以下問題:

  • 如何呼叫****登錄或非登錄shell _
  • 如何檢測****登錄或非登錄shell _
  • 登錄或非登錄shell將使用哪些啟動文件
  • man bash有關詳細資訊,請參閱文件(例如)

答案沒有說明的(也是我仍然感到困惑的事情)是:

  • 登錄或非登錄shell的案例是什麼?(例如,我只進行了配置,這足以滿足大多數個人開發需求,我知道這並不像 what to那樣簡單)zshrc``zsh``vimrc``vim
  • 非登錄shell上使用登錄的****原因是什麼(除了使用不同的啟動文件和生命週期)?

這個想法是使用者應該(至多)每個主機有一個登錄 shell。(也許我應該說,每個終端每個主機一個登錄 shell — 如果您通過多個終端同時登錄到一個主機,您會期望有多個登錄 shell。)這通常(總是?)是您獲得的第一個shell登錄後(因此得名)。因此,此方案允許您指定每次登錄時只希望發生一次的操作以及每次啟動新(互動式)shell 時希望發生的事情。

通常,您在登錄後執行的每個其他 shell 都將是登錄 shell 的後代(一個孩子的孩子的孩子……),因此將從登錄 shell 繼承許多設置(環境變數umask等)。因此,這個想法是登錄初始化文件(.login,.profile等)應該設置可繼承的設置,並讓.bashrc(或您使用的其他任何東西)處理那些不是(set, shopt,非導出的 shell 變數, ETC。)

另一個概念是登錄初始化文件(並且只有它們)應該做“繁重的工作”,即資源密集型操作。例如,您可能希望在登錄時讓某些程序在後台執行(但只有一個副本(實例))。您可能希望在登錄時顯示一些狀態資訊(例如,dfwho),但不是每次啟動新的互動式 shell 時都顯示。特別是如果你有一個互動您希望每次登錄時執行的程序/對話框(即需要您輸入的程序),您可能不希望每次啟動新 shell 時都執行它。舉個極端的例子,二十年前,Solaris 將您登錄到一個單一的、非圖形的、非視窗的 shell。(我相信從那時起它已經發生了變化。).login.profile(或其他)的工作是使用類似startx. (這很有用,部分原因是有多個視窗系統可用。不同的使用者有不同的偏好。一些使用者在不同的情況下使用不同的系統,我們有一個對話框.profile詢問“你今天想使用哪個視窗系統?”)顯然,您不希望每次打開新視窗或鍵入時都執行它sh.

自從我使用bash 除邊緣情況以外的任何東西以來已經有很長時間了。(例如,我使用 編寫腳本#!/bin/sh,因此在某些系統上,我的腳本使用 執行dash,而在其他系統上執行它們以bashPOSIX 模式執行。一年幾次,我執行csh/tcsh幾分鐘以查看它如何處理某些事情,或者回答問題。)如果您每天使用多個 shell(例如bash和),您的模式可能會有所不同。zsh如果您的主 shell(如 中定義/etc/passwd)是bash,您可能想要呼叫登錄 shell,然後可能呼叫一些從屬於它zsh的互動式非登錄shell。zsh您可能應該避免使用從屬於另一個相同類型的登錄 shell 的登錄 shell。

正如Login Shell 和 Non-Login Shell 之間的區別?,OS X 終端應用程序執行一個登錄 shell,因此典型使用者通常會同時執行多個“登錄 shell”。這與我上面描述的模型有些不同,可能需要使用者重新考慮他在他.login.profile(或其他)文件。我不知道 OS X 開發人員是否記錄了他們做出這一設計決定的理由。但我可以想像這種情況會有用。有一段時間,我登錄時習慣性地打開幾個 shell 視窗,我會將它們設置為不同的文本和背景顏色(通過將 ANSI 轉義序列寫入螢幕)來幫助我跟踪哪個是哪個。終端顏色是不被孩子的孩子繼承的東西的一個例子,但確實在視窗中持續存在。因此,這是您每次啟動新終端視窗時都想做的事情,但不是每次啟動新的互動式 shell 時都想做的事情。

引用自:https://unix.stackexchange.com/questions/324359