在 `/etc/profile.d` 中导出的变量如何最终出现在 Gnome 上的 systemd 用户环境中?

在 `/etc/profile.d` 中导出的变量如何最终出现在 Gnome 上的 systemd 用户环境中?

在带有 Systemd 的 Gnome 上,systemd 用户环境变量是使用以下命令配置的:系统环境.d机制,它不依赖于 shell 脚本,而是依赖于配置文件。同时,许多环境变量是在 Gnome 会话中使用/etc/profile.d/*.

这两个系统(environment.d配置文件和中的脚本/etc/profile.d/*)是不可渗透的(即使有办法手动导入这些变量,例如systemctl --user import-environment

此外,当使用 Wayland 时,不会/etc/profile.d/*像在 Xorg 上的 Gnome 中那样获取脚本(使用脚本/etc/gdm/Xsession,脚本/etc/profile本身会获取/etc/profile.d/*~/.profile脚本)。

因此,在使用 Gnome 时,这些导出的变量/etc/profile.d/*不应出现在 systemd 用户环境中,在 Xorg 中也不应出现,更不用说在 Wayland 中也不应出现。

然而,这种情况并非如此。例如,该/etc/profile.d/google-cloud-sdk.sh脚本导出一些自定义变量:

export CLOUDSDK_ROOT_DIR=/opt/google-cloud-sdk
export CLOUDSDK_PYTHON=/usr/bin/python
export CLOUDSDK_PYTHON_ARGS=-S
export PATH=$CLOUDSDK_ROOT_DIR/bin:$PATH
export GOOGLE_CLOUD_SDK_HOME=$CLOUDSDK_ROOT_DIR

在 Wayland 和 Xorg 上登录 Gnome 后,我们运行systemctl --user show-environment

我们看到完全相同的变量:

...
XDG_RUNTIME_DIR=/run/user/1000
CLOUDSDK_PYTHON=/usr/bin/python
CLOUDSDK_PYTHON_ARGS=-S
CLOUDSDK_ROOT_DIR=/opt/google-cloud-sdk
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
...
GOOGLE_CLOUD_SDK_HOME=$CLOUDSDK_ROOT_DIR
...

在许多其他变量中。

补充两点:

  • 导出的变量在~/.profilesystemd 用户环境中看不到,这意味着/etc/profile脚本本身不是来源的:/etc/profile.d/*脚本似乎是直接来源的
  • /etc/profile.d/*中没有引用任何脚本systemd 环境生成器

那么,考虑到 systemd 或 gnome 没有记录的方式来获取这些/etc/profile.d/*脚本,这怎么可能呢?

相关内容