问题描述
我最近发现了 /etc/environment
,这似乎是比脚本更标准的设置简单环境变量的方法,但我想知道 /etc/environment 文件中是否有办法设置 back-reference 环境变量。
也就是说,我有这个:
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 中的环境变量?
最佳方法
/etc/environment
文件由 pam_env
PAM 模块读取。仅支持简单的键值对,right-hand 端不进行替换。
如果您想通过替换或其他 shell 扩展来构建值,则需要通过 shell。 /etc/profile
(或 /etc/profile.d
中的文件)是放置这些的正确位置。这是传统的地方(/etc/environment
是 unix 系统历史上相对较新的创新),使用它当然不能马虎。 /etc/environment
的主要好处是,即使使用不涉及 shell 的登录方法或使用非 Bourne shell 的用户,它也允许设置环境变量,但这些在实践中并不常见。
次佳方法
Ubuntu 文档让这看起来不可能。但是,有一个答案。
答案:在 /etc/.bashrc
中创建持久的系统范围环境变量
JAVA_HOME="/tools/java"
...
PATH="$JAVA_HOME:$PATH"
详细信息:\n以下是 Environment Variables documentation 的更多详细信息。\n官方建议使用 /etc/environment
,正如您所尝试的那样。问题是这个文件不是脚本文件。换句话说,不能在变量声明中使用变量。
该文档继续提供另外 2 个 “Not Recommended” 文件\n /etc/profile
和 /etc/bash.bashrc
。
/etc/profile
“只不过是调用 /etc/bash.bashrc 文件”。所以改为选择
/etc/bash.bashrc
,因为“Ubuntu 默认配置为在用户进入 shell 或桌面环境时执行此文件。”