在* / etc / environment中引用环境变量*?

我最近发现了/etc/environment ,这似乎是设置简单环境变量比脚本更标准的方法,但我想知道是否有办法在/ etc / environment文件中反向引用环境变量。

也就是说,我有这个:

 JAVA_HOME="/tools/java" GRAILS_HOME="/tools/grails" GROOVY_HOME="/tools/groovy" GRADLE_HOME="/tools/gradle" PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games" 

但是,如果我尝试将$JAVA_HOME/bin添加到PATH定义中,则会得到$ JAVA_HOME / bin,而不是插值变量。 为了解决这个问题,我在profile.d中创建了environment.sh,将/bin条目添加到路径中,但这看起来很邋and且杂乱无章。

有没有办法在/ etc / environment中反向引用环境变量?

/etc/environment文件由pam_env PAM模块读取。 它只支持简单的键值对,右侧没有替换。

如果要使用替换或其他shell扩展来构建值,则需要通过shell。 /etc/profile (或/etc/profile.d中的/etc/profile.d )是这些的正确位置。 这是传统的地方( /etc/environment是一个相对较新的创新,在unix系统的历史中),并且使用它当然没有任何草率。 /etc/environment的主要好处是它允许使用不涉及shell的登录方法或使用非Bourne shell的用户设置环境变量,但这些在实践中并不常见。

Ubuntu文档使这看起来不可能。 但是,有一个答案。

解答 :在/etc/.bashrc创建持久的系统范围环境变量

 JAVA_HOME="/tools/java" ... PATH="$JAVA_HOME:$PATH" 

细节:
以下是Environment Variables文档中的更多详细信息。
正如您所尝试的那样,官方建议使用/etc/environment 。 问题是这个文件不是脚本文件。 换句话说,您不能在变量声明中使用变量。

文档继续使用另外两个“不推荐”文件
/etc/profile/etc/bash.bashrc

/etc/profile “只是调用/etc/bash.bashrc文件”。 所以改为选择

/etc/bash.bashrc因为“每当用户进入shell或桌面环境时,默认情况下都会配置Ubuntu来执行此文件。”