淺談“圖形登錄”後shell初始化與桌面應用的關係
當使用者通過文本界面登錄時,我非常 (
zsh
)/有點 (bash
) 熟悉 shell 的初始化順序。但是,當使用者通過圖形界面(例如通過 Linux 上的所謂“顯示管理器”或標準 OS X 登錄)登錄時,“圖形登錄”(IOW)的情況又如何呢?
我對那些應該僅用於“登錄外殼”的文件(
.zprofile
,.zlogin
, )特別感興趣。.profile
當通過文本界面登錄時,這或多或少等同於“每個會話僅獲取一次”。當通過圖形界面登錄時,我不清楚是否有一個“登錄外殼”開始。即使
.zprofile
等人。作為圖形登錄序列的一部分,在某些時候以某種方式獲取,我不清楚這些文件的獲取所產生的設置(例如導出的環境變數)如何影響會話的其餘部分。例如,這些設置是否會影響登錄時自動啟動的應用所看到的環境?還是通過使用者稍後通過點擊桌面圖示啟動的應用程序?
就此而言,發生在
.zshenv
或.zshrc
/.bashrc
1中的設置呢?它們對“自動啟動”和/或“點擊啟動”應用程序所看到的環境有任何影響嗎?如果最後兩個問題的任何一個的答案類似於“不是預設情況下”,那麼後續問題將是:如何確保在(至少)
.zprofile
/中執行的設置.profile
,也可能.zlogin
,被傳輸到所有“自動啟動”和“點擊啟動”應用程序所看到的環境?我對兩個 shell 和兩個作業系統(Linux 和 OSX)的這些問題的答案
zsh
感興趣bash
。1假設
.zshrc
/.bashrc
是作為“互動式”shell 的zsh
/bash
內置初始化序列的一部分獲取的,而不是由.zprofile
/顯式獲取.profile
。
只有在呼叫 shell 時,shell 配置文件才會發揮作用。他們沒有什麼神奇之處。任何過程都可以改變它的環境。大多數人只閱讀它,但任何 exec 的另一個程序都傾向於首先改變環境。
這一切都以init或系統上的任何 pid 1 開始。它啟動 X 伺服器,它啟動提供登錄提示的顯示管理器。啟動 X11 的序列不需要包含登錄 shell;例如,init可以在 /usr/bin/startx 上呼叫 fork(2) 和 exec(2)。沒有登錄,沒有
.profile
。X 伺服器僅繼承由init導出的環境。X 伺服器的環境是什麼樣的?您可以使用 ps(1) 提取程序的環境。更簡單但不確定的是使用ssh主機名/usr/bin/env(其中主機名是託管 X11 伺服器的機器的名稱)。與 X 伺服器通常發生的情況類似,sshd 執行env而不創建登錄 shell。
然後,當您登錄時,我們會處理您的顯示管理器所做的任何事情。它分叉一個程序,將 uid 從(可能)root 更改為您的,並啟動會話管理器。有關詳細資訊,我建議您閱讀友好的手冊。
從那時起,會話管理器通過任何方式建立了它的環境。它創建的程序——命令解釋器或通過“點擊”它們的其他應用程序——繼承它的環境。會話管理器可以提供一種在每個圖示的基礎上定義附加環境變數值的方法,並且被點擊的東西啟動的過程可能(就像 shell 一樣)在啟動時改變它的環境,可能是通過配置文件。
這一切都在那裡。要了解環境是如何形成的,您“只需”遵循創建它的過程鏈,並了解每個過程對環境做了什麼。不幸的是,該鏈不僅因作業系統、發行版以及機器和使用者配置而異,而且它也沒有特別完善的文件或工具。祝你好運,例如,找到說明在 sshd 啟動之前將設置哪些環境變數的文件,或者找到顯示會話管理器環境的 X11 客戶端。