Linux 中有太多地方可以保存永久的环境变量设置,因此我无法找出哪一个是最正确/最合适的。
- /etc/环境
- /etc/bash.bashrc
- /etc/配置文件
- /etc/profile.d/*
- 〜/ .bash
- 〜/ .profile
....
现在我需要设置一个环境变量,它是我项目代码库的路径,并且这个环境变量应该与我的 Debian-12 的许多用户共享。
我应该使用上述哪种方法?
换句话说,哪种方法适合我的要求?
谢谢!
答案1
简而言之,/etc/profile.d/*.sh
是所有用户的环境变量的传统位置,但现在/etc/environment
可能会涵盖更多一些。
如今,并非所有进程都经过相同的启动路径;实际上,使用 GNOME 作为图形界面时,将有两个具有不同配置的并行路径,和其中之一可能会表现出不同的行为,具体取决于您选择 Wayland 模式还是 GNOME 的 X11 模式(即将被删除)。
当您登录任何系统时,“pam_env”都会作为 PAM 的一部分运行并加载 /etc/environment。这是最适合用于“系统范围”环境变量的位置,这些变量必须应用于每种用户会话。
如果选择了 X11 会话,GDM 的 Xsession 脚本将加载 /etc/profile、/etc/xprofile、~/.profile、~/.xprofile(作为“sh”shell 脚本 - 无论您通常使用什么 shell)。因此 /etc/xprofile 是存放任何固有 X11 特定内容的好地方。
如果选择了 Wayland 会话,GDM 根本不会加载任何内容,但 gnome-session 会通过默认登录 shell 重新启动自身,从而提供类似的行为,因此如果您使用 Bash,则会加载 /etc/profile、~/.profile(或 ~/.bash_profile)。因此,/etc/profile 是适用于所有 GUI 进程的环境变量的理想位置。
在这两种情况下,如果 /etc/profile 正在运行,它通常也会加载 /etc/profile.d/*.sh。很多需要特定环境变量的软件包都是通过 /etc/profile.d/ 来加载的。
(如果 ~/.profile 通过 Bash 运行,它也会明确加载 ~/.bashrc;不过,我通常会不是将全局环境变量放在 bashrc 中,因为在 X11 情况下 ~/.profile 实际上是通过 /bin/sh 运行的,而这不是 Debian 上的 Bash。)
同时,登录会导致“systemd --user”服务管理器在后台独立启动。这还自行调用 PAM – 包括 pam_env – 因此它将从 /etc/environment 拥有的所有内容开始。
'systemd --user' 服务管理器在启动其“用户级”后台服务之前会从 /etc/environment.d/ 和 ~/.config/environment.d/(参见 'man environment.d')加载所有内容。
现在,gnome-session 调用“systemd-user”并提供从步骤 1-2 收集的环境变量(基本上执行“systemctl --user import-environment”),然后要求它启动 GNOME GUI 的其余部分。因此,GUI 应用程序将具有来自步骤 1-2 和 3-4 的环境变量的组合,因为它们实际上来自“systemd-user”,而不是来自 GDM/gnome-session。
最后,如果用户打开终端应用程序,则在该终端窗口内运行的 shell 通常会加载 /etc/bash.bashrc、~/.bashrc(但通常不是在“配置文件”脚本中)。因此,bashrc 中定义的任何内容都可用于终端窗口,但不可用于系统的其余部分;它是放置 shell 特定内容(不仅仅是环境,还有别名等)的好地方。
对于 SSH 登录,该过程稍微简单一些,因为不涉及“systemd-user”(它确实启动了但仍在后台并且不参与您的登录 shell)。
SSH 服务器也调用“pam_env”,加载 /etc/environment。
SSH 服务器启动您的登录 shell;如果是 Bash,它将加载 /etc/profile(包括 .d/*.sh)和 ~/.profile。通常,您的 ~/.profile 通常会加载 ~/.bashrc。
控制台(tty)登录的工作方式相同(只是使用“/sbin/login 进程”而不是“SSH 服务器”)。