在 Linux 上设置系统范围的环境变量的最佳位置是什么?

sor*_*rin 26 ubuntu debian environment-variables

我只想JAVA_HOME所有用户(包括 root用户)设置一个系统范围的环境变量。

要求:

  • 普通用户可以访问
  • root 可以访问
  • 始终加载,不仅用于 bash(默认情况下 gnome-terminal 不启动 bash)
  • 在 Ubuntu、Debian 和可选的 Red Hat 上工作
  • 如果添加可以轻松编写脚本,那就太好了

sor*_*rin 30

对于 Ubuntu 以及其他可能的 *nix 平台,在/etc/profile.dnamed 中添加一个新脚本java.sh,例如:

echo "export JAVA_HOME=/usr/lib/jvm/default-java" > /etc/profile.d/java.sh
Run Code Online (Sandbox Code Playgroud)

排除的其他考虑因素:

  • /etc/environment- 工作,但使用其他工具更难维护(或者人们会编辑它);和
  • /etc/profile - 相同的缺点 /etc/environment


小智 12

在 Debian/Ubuntu 上,这将是/etc/environment

我不知道 Red Hat 的等价物。

  • 我相信 /etc/environment 已被弃用 (2认同)

dmo*_*ati 11

我不明白你为什么排除 /etc/profile.conf 文件。那是正确的位置。


lin*_*ish 9

一些人回答说/etc/environmentDebian 已弃用和/或不再使用,这是(在版本 7 中)错误的。

该文件实际上是由 PAM 读取的——特别是pam_env(8),通过envfile标志的默认值。联机帮助页还在 FILES 部分下说明了此默认值。

引用的维基(尤其是语言环境)仅说明基于语言环境的环境变量现在应该在/etc/profile. 他们的声明“(在旧版本的 Debian 中,还有 /etc/environment)”是模糊的,并且是在语言环境的上下文中。

快速搜索/etc/pam.d显示:

root@box:/etc/pam.d# grep pam_env.so *
atd:auth        required        pam_env.so
cron:session       required   pam_env.so
cron:session       required   pam_env.so envfile=/etc/default/locale
login:session       required   pam_env.so readenv=1
login:session       required   pam_env.so readenv=1 envfile=/etc/default/locale
sshd:auth       required     pam_env.so # [1]
sshd:auth       required     pam_env.so envfile=/etc/default/locale
su:session       required   pam_env.so readenv=1
su:session       required   pam_env.so readenv=1 envfile=/etc/default/locale
Run Code Online (Sandbox Code Playgroud)

这些配置行是附加的,由于缺少第一个envfile,因此默认为/etc/environment.

当然,所有这些都依赖于您使用的任何二进制文件(crond、登录 shell 等)是针对 PAM 编译的。

最后,这意味着使用 PAM 的其他系统(例如 RedHat)的行为是相同的,可以在其各自的联机帮助页中看到。