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

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

使用 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 环境变量的设置?

答案1

  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 默认只附带一个这样的“环境生成器”,它从环境.d目录:

    • ~/.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

答案2

TL;DR:gnome-session以非交互式登录模式调用用户的 shell,并且由 systemd 导入生成的环境。

用户1686的回答为我指明了正确的方向:可能是gnome-session。所以我在 Google 上搜索了“gnome-session 环境变量”,似乎gnome-session调用了一些 shell,然后将环境导入到 systemd 中。

为了确定到底发生了什么,我做了几个实验,移动export本文作为参考。结果发现~/.zshenv,或中设置的变量~/.zprofile将进入用户 systemd,但~/.profile和中设置的变量~/.zshrc则不会。似乎可以肯定地得出结论,您的帐户的 shell 被调用为非交互式登录 shell,然后由 systemd 导入环境。

我的 PATH 出现问题是因为export一次出现在 中.zshenv,一次出现在 中.zprofile,一次出现在.profile我的.zprofile源中。作为解决方案,我建议将所有内容放入.profile.zprofile对其进行源代码制作。此方法在 X 和 wayland 中均有效。

相关的侏儒虫; 相关的来源(是的,gnome-session是shell脚本)。

相关内容