我有一个 bash 文件(我们称之为 bash_file),其中包含许多环境变量分配(例如TOOLS_DIR="/opt/tools"
)以及 bash 代码,它获取另一个文件(例如source /opt/other_file
)并从来自 other_file 的环境变量构造环境变量(例如NEW_ENV_VAR=$FILEPATH/$FILENAME
FILEPATH 和FILENAME 在 other_file 中分配)。
我有一个 Java 应用程序,它需要这些环境变量的可见性,但是使用标准System.getenv()
并没有获取这些环境变量,因为 bash 文件还没有在 Java 的 shell 中获取。如果我使用 Java 的Runtime.exec("source bash_file")
,那么环境变量只存在于 Java 的子 shell 中,即使使用了 bash 的export
命令。
如果我在纯 bash 中,我只需执行我的source bash_file
并且我可以访问在 bash_file 中分配的所有环境变量,但在 Java 中并不是那么简单。
我已经想到了几个选项,但没有一个看起来特别优雅:
在使用该
source bash_file
命令的同一进程中,将当前添加env
到 .bashprofile,以便它可用于所有未来的运行时 exec 调用,例如 System.getenv()。问题:我不能 100% 确定 getenv 是否会在运行时接收到添加到 bashprofile 的 env var,并且将所有这些变量全局导出一点都不好。
再次在与 相同的过程中
source_bash_file
,将当前保存env
到文本文件,并使用 Java 手动解析。问题:这可以完成工作,但远不如
System.getenv()
. 用 Java 编写解析器似乎也很棘手。找出 Java 的 bash 环境在哪里实例化(可能在 java.System.lang 中)并修改以在初始化 Java 环境
source bash_file
之前执行,因此我的 Java 应用程序继承了这些变量。问题:这似乎是我所有选项中最混乱的一个,我不知道从哪里开始寻找 Java 的 shell 环境的初始化。
有什么方法可以source
从 Java 执行类似 bash 的操作,或者,获取该功能的最简单实现是什么?在评估可能的行动方案时,我也表达了一些不确定性,如果有人能向我补充这些不确定性,我将不胜感激。
谢谢!