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


19

我最近发现/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条目添加到路径中,但这似乎草率且杂乱无章。

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

Answers:


13

/etc/environment文件由pam_envPAM模块读取。它仅支持简单的键/值对,右侧没有替代项。

如果要使用替换或其他Shell扩展来构建值,则需要遍历Shell。/etc/profile(或中的文件/etc/profile.d)是正确的选择。这是传统的地方(/etc/environment在Unix系统的历史上是相对较新的创新),使用它当然不会马虎。这样做的主要好处/etc/environment是,即使使用不涉及Shell的登录方法或使用非Bourne Shell的用户登录,也可以设置环境变量,但是在实践中并不常见。


如果没有替代,您最终会在中产生很多冗余/etc/environment,我求助于/etc/profile,谢谢您的建议。
SAFX 2013年

2

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

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

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

详细信息:
这是环境变量文档中的更多详细信息。
官方建议使用/etc/environment,就像您尝试过的那样。问题是此文件不是脚本文件。换句话说,您不能在变量声明中使用变量。

本文档继续介绍另外2个“不推荐”文件
/etc/profile/etc/bash.bashrc

/etc/profile“只不过是调用/etc/bash.bashrc文件而已”。所以选择

/etc/bash.bashrc 因为“默认情况下,Ubuntu配置为在用户进入外壳程序或桌面环境时都执行此文件”。


我已经与一些Ubuntu开发人员协商更新了EnvironmentVariables,因此不再存在那些“不推荐”的语句。
Gunnar Hjalmarsson 2014年

“每当用户进入外壳时”。没有用户输入shell时该怎么办?对于在启动时运行软件的自动化用户,我需要环境变量。例如,仅我就有6行代理配置。我该怎么办?
eis 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.