論「圖形登入」後 shell 初始化與桌面應用程式之間的關係

論「圖形登入」後 shell 初始化與桌面應用程式之間的關係

當使用者透過文字介面登入時,我非常(zsh)/有點( )熟悉 shell 的初始化序列。bash

但是,當使用者透過圖形介面(例如,透過 Linux 上所謂的「顯示管理器」或標準 OS X 登入)登入時,「圖形登入」IOW 的情況又如何呢?

我對那些應該只用於「登入 shell」的檔案( .zprofile.zlogin、 )特別感興趣。.profile當透過文字介面登入時,這或多或少相當於「每個會話僅一次」。

當透過圖形介面登入時,我不清楚是否有一個「登入外殼」。即使.zprofile等人。作為圖形登入序列的一部分在某個時刻以某種方式獲取,我不清楚這些文件的獲取所產生的設定(例如導出的環境變數)如何影響會話的其餘部分。

例如,這些設定是否會影響登入時自動啟動的應用程式所看到的環境?或透過使用者稍後透過點擊桌面圖示啟動的應用程式?

.zshenv就此而言,或.zshrc/ .bashrc1中發生的設定怎麼樣?它們對「自動啟動」和/或「點擊啟動」應用程式所看到的環境有任何影響嗎?

如果最後兩個問題之一的答案類似於“不是預設情況下”,則後續問題將是:如何確保(至少).zprofile/中執行的設定.profile(也可能是.zlogin)傳輸到所有“自動啟動”和“單擊啟動”應用程式看到的環境?

zsh我對兩個 shell和bash以及兩個作業系統(Linux 和 OSX)的這些問題的答案感興趣。


1假設.zshrc/是作為「互動式」shell 的/內建初始化序列.bashrc的一部分取得的,而不是由/明確取得的。zshbash.zprofile.profile

答案1

Shell 設定檔僅在呼叫 shell 時才起作用。他們沒有什麼神奇的。任何進程都可以改變其環境。大多數人只閱讀它,但是任何執行另一個程式的程式都容易有理由先改變環境。

一切都始於在裡面,或您系統上的任何 pid 1。它啟動 X 伺服器,從而啟動顯示管理器,並提供登入提示。啟動 X11 的序列不需要包含登入 shell;例如,在裡面可以在 /usr/bin/startx 上呼叫 fork(2) 和 exec(2)。沒有登入,沒有.profile。 X伺服器僅繼承由匯出的環境在裡面

X伺服器的環境是什麼樣的?您可以使用 ps(1) 擷取進程的環境。更簡單,但不是確定的,是使用SSH主機名稱/usr/bin/env(在哪裡主機名稱是託管 X11 伺服器的電腦的名稱)。與 X 伺服器通常發生的情況類似,sshd 執行環境無需建立登入 shell。

然後我們來看看當您登入顯示管理員時它會做什麼。它分叉一個進程,將 uid 從(可能)根更改為您的,並啟動會話管理器。有關詳細信息,我向您推薦您友好的手冊。

從那時起,會話管理器已經透過任何方式建立了它的環境。它創建的進程(透過「單擊」命令解釋器或其他應用程式)繼承其環境。會話管理器可以提供一種在每個圖示的基礎上定義附加環境變數值的方法,並且被點擊的事物啟動的進程可以(如外殼程式那樣)在啟動時改變其環境,可能是透過設定檔。

一切都在那裡。要了解環境是如何形成的,您「只需」遵循創建環境的一系列流程,並了解每個流程對環境做了什麼。不幸的是,該鏈不僅因作業系統、發行版以及機器和使用者配置而異,而且還沒有特別完善的文件或工具。祝你好運,例如,找到說明在 sshd 啟動之前將設定哪些環境變數的文檔,或找到顯示會話管理器環境的 X11 用戶端。

相關內容