论“图形登录”后 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 客户端。

相关内容