使用 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
在 systemd --user 启动之前,所有 PAM“会话”模块都会
/etc/pam.d/systemd-user
被调用。当 systemd --user 启动时,它会运行一组“环境生成器“输出环境变量的程序。它们可以在以下位置找到:
/etc/systemd/user-environment-generators/
/usr/local/lib/systemd/user-environment-generators/
/usr/lib/systemd/user-environment-generators/
Systemd 默认只附带一个这样的“环境生成器”,它从环境.d目录:
~/.config/environment.d/*.conf
/etc/environment.d/*.conf
/run/environment.d/*.conf
/usr/lib/environment.d/*.conf
/etc/environment
当你的图形会话启动时(无论是使用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 中均有效。