Linux 中有太多地方可以保存永久的环境变量设置,因此我无法找出哪一个是最正确/合适的。
- /etc/环境
- /etc/bash.bashrc
- /etc/配置文件
- /etc/profile.d/*
- 〜/.bash
- 〜/.profile
....
现在我需要设置一个 env-var,它是我的项目代码库的路径,并且这个 env-var 应该与我的 Debian-12 的许多用户共享。
我应该使用上述哪种方法?
换句话说,哪种方法适合我的要求?
谢谢!
Linux 中有太多地方可以保存永久的环境变量设置,因此我无法找出哪一个是最正确/合适的。
....
现在我需要设置一个 env-var,它是我的项目代码库的路径,并且这个 env-var 应该与我的 Debian-12 的许多用户共享。
我应该使用上述哪种方法?
换句话说,哪种方法适合我的要求?
谢谢!
简而言之,
/etc/profile.d/*.sh
是所有用户的环境变量的传统位置,但现在/etc/environment
可能涵盖更多内容。如今,并非所有进程都经历相同的启动路径;在使用 GNOME 作为图形界面的实践中,将会有两条具有不同配置的并行路径,其中一条的行为可能会有所不同,具体取决于您为 GNOME 选择的是 Wayland 模式还是(即将删除)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 重新启动自身来提供类似的行为,因此如果您加载 /etc/profile、~/.profile(或 ~/.bash_profile),正在使用 Bash。因此 /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/ 中的所有内容(请参阅“manenvironment.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 服务器”)。