在Linux上设置系统环境variables的最佳位置是什么?

我只想为所有用户(包括root用户)设置系统范围的环境variablesJAVA_HOME

要求:

  • 普通用户可以访问
  • 根访问
  • 总是加载,不仅仅是bash(gnome-terminal默认不启动bash)
  • 在Ubuntu,Debian和Red Hat上工作
  • 很好,如果可以轻松地添加脚本

    由于没有人添加完整的答案,这里是我目前认为最好的,至less在Ubuntu的,但我打开适应其他* nix平台的答案。

     # **create**: /etc/profile.d/java.sh export JAVA_HOME=/usr/lib/jvm/default-java 

    其他已被考虑但排除的选项:

    • /etc/environment可以工作,但是难以维护,因为其他工具或人员可以编辑它。
    • /etc/profile – 和上面一样

    在Debian / Ubuntu上将是/ etc / environment

    我不知道红帽的等价物。

    我不明白你为什么排除/ etc / profile。 这是正确的位置。

    有几个人回答说/etc/environment已经在Debian中被删除和/或者不被使用了,这是(在版本7)是错误的。

    该文件实际上是由PAM读取的 – 具体来说是pam_env(8) ,通过默认envfile标志。 该手册页还在FILES部分中声明了这个默认值。

    引用的维基(特别是locale一)只是声明基于locale的环境variables现在意味着在/etc/profile 。 他们的声明“(在旧版本的Debian中,也是/ etc / environment)”是模糊的,并且是语言环境的上下文。

    通过/etc/pam.d快速的grep显示:

     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 

    这些configuration行是附加的,因为第一个缺lessenvfile ,所以默认是/etc/environment

    当然,所有这些都依赖于你使用的二进制文件( crond ,login shell等)。

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

    一个侧面说明:看看模块环境 。 每次我必须为几十个或数百个用户提供一个复杂的,版本化的,可自我扩展的,简洁的UNIX环境时,我都会使用它。 它主要用于大规模多用户HPC环境。 只是将它用于一个特定的variables当然是过度devise它,但是一旦你需要更多的软件包和它们的环境,它确实是一个很棒的工作。

    /etc/profile应该可以工作。 我刚刚testing了一下,把export SOMETEST=1234放到/etc/profile ,重新login后echo $SOMETEST给了我1234的预期。 也从gnome-terminal

    /etc/enviroment在上一个debian stable版本中没有使用。 如Sorin S所说,build议在/etc/profile.d/创build自己的*.sh文件。 请参阅https://wiki.debian.org/EnvironmentVariables

    在这种情况下,你不能使用任何特定的文件。 所以….

    在这种情况下, /etc/profile将是适当的地方。 当前login的用户必须获得新的login会话,但这不应该是一个大问题。

    @ wk01:默认情况下, /etc/profile不是由非loginshell加载的。 您的.bashrc可能正在加载它…