systemd 用户实例中的 PATH 环境变量是如何设置的?

Ton*_*bda 6 linux path environment-variables systemd

使用 Ubuntu 21.04、GNOME 3.38.5 Wayland 和 zsh 作为我的 shell,

$ systemctl --user show-environment

PATH=/home/tony/.cargo/bin:/home/tony/.cargo/bin:/home/tony/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin

我想知道如何~/.cargo/bin重复三遍,但找不到一处设置它的地方。 ~/.pam_environment根本没有提到“PATH”,而且我从来没有运行过 rust 工具链sudo,所以这个变量不太可能在位于/etc.

如何跟踪 PATH 环境变量的设置?

use*_*686 10

  1. 在 systemd --user 启动之前,将调用所有 PAM“会话”模块/etc/pam.d/systemd-user

  2. 当 systemd --user 启动时,它会运行一组“环境生成器”,它们是输出环境变量的程序。它们可以在以下位置找到:

    • /etc/systemd/user-environment-generators/
    • /usr/local/lib/systemd/user-environment-generators/
    • /usr/lib/systemd/user-environment-generators/
  3. 默认情况下,Systemd 仅附带一个这样的“环境生成器”,它从environment.d目录中读取简单的 KEY=value 文件:

    • ~/.config/environment.d/*.conf
    • /etc/environment.d/*.conf
    • /run/environment.d/*.conf
    • /usr/lib/environment.d/*.conf
    • /etc/environment
  4. 当图形会话启动时(无论是使用 startx 还是显示管理器),链中通常有一些脚本调用systemctl --user import-environment并将$PATH 以及交互式环境中的其他所有内容复制到 systemd 环境中。

    也可以完成同样的操作dbus-update-activation-environment --systemd,它将环境变量复制到正在运行的“dbus-daemon --session”中,但使用额外的选项,它还会更新 systemd。

    gnome-session 也可以本地完成相同的操作,用于选择环境变量(我不确定 $PATH 是否是其中之一)。

    “导入”工具可以从以下位置调用:

    • ~/.xinitrc
    • ~/.xsession
    • /etc/X11/xinit/xinitrc.d/50-systemd-user.sh