在哪里为 Debian12 设置环境变量?

在哪里为 Debian12 设置环境变量?

Linux 中有太多地方可以保存永久的环境变量设置,因此我无法找出哪一个是最正确/最合适的。

  1. /etc/环境
  2. /etc/bash.bashrc
  3. /etc/配置文件
  4. /etc/profile.d/*
  5. 〜/ .bash
  6. 〜/ .profile

....

现在我需要设置一个环境变量,它是我项目代码库的路径,并且这个环境变量应该与我的 Debian-12 的许多用户共享。

我应该使用上述哪种方法?

换句话说,哪种方法适合我的要求?

谢谢!

答案1

简而言之,/etc/profile.d/*.sh是所有用户的环境变量的传统位置,但现在/etc/environment可能会涵盖更多一些。

如今,并非所有进程都经过相同的启动路径;实际上,使用 GNOME 作为图形界面时,将有两个具有不同配置的并行路径,其中之一可能会表现出不同的行为,具体取决于您选择 Wayland 模式还是 GNOME 的 X11 模式(即将被删除)。

  1. 当您登录任何系统时,“pam_env”都会作为 PAM 的一部分运行并加载 /etc/environment。这是最适合用于“系统范围”环境变量的位置,这些变量必须应用于每种用户会话。

  2. 如果选择了 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。)

  3. 同时,登录会导致“systemd --user”服务管理器在后台独立启动。这自行调用 PAM – 包括 pam_env – 因此它将从 /etc/environment 拥有的所有内容开始。

  4. 'systemd --user' 服务管理器在启动其“用户级”后台服务之前会从 /etc/environment.d/ 和 ~/.config/environment.d/(参见 'man environment.d')加载所有内容。

  5. 现在,gnome-session 调用“systemd-user”并提供从步骤 1-2 收集的环境变量(基本上执行“systemctl --user import-environment”),然后要求它启动 GNOME GUI 的其余部分。因此,GUI 应用程序将具有来自步骤 1-2 和 3-4 的环境变量的组合,因为它们实际上来自“systemd-user”,而不是来自 GDM/gnome-session。

  6. 最后,如果用户打开终端应用程序,则在该终端窗口内运行的 shell 通常会加载 /etc/bash.bashrc、~/.bashrc(但通常不是在“配置文件”脚本中)。因此,bashrc 中定义的任何内容都可用于终端窗口,但不可用于系统的其余部分;它是放置 shell 特定内容(不仅仅是环境,还有别名等)的好地方。

对于 SSH 登录,该过程稍微简单一些,因为不涉及“systemd-user”(它确实启动了但仍在后台并且不参与您的登录 shell)。

  1. SSH 服务器也调用“pam_env”,加载 /etc/environment。

  2. SSH 服务器启动您的登录 shell;如果是 Bash,它将加载 /etc/profile(包括 .d/*.sh)和 ~/.profile。通常,您的 ~/.profile 通常会加载 ~/.bashrc。

控制台(tty)登录的工作方式相同(只是使用“/sbin/login 进程”而不是“SSH 服务器”)。

相关内容