3

我有一个 bash 文件(我们称之为 bash_file),其中包含许多环境变量分配(例如TOOLS_DIR="/opt/tools")以及 bash 代码,它获取另一个文件(例如source /opt/other_file)并从来自 other_file 的环境变量构造环境变量(例如NEW_ENV_VAR=$FILEPATH/$FILENAMEFILEPATH 和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 中并不是那么简单。

我已经想到了几个选项,但没有一个看起来特别优雅:

  1. 在使用该source bash_file命令的同一进程中,将当前添加env到 .bashprofile,以便它可用于所有未来的运行时 exec 调用,例如 System.getenv()。

    问题:我不能 100% 确定 getenv 是否会在运行时接收到添加到 bashprofile 的 env var,并且将所有这些变量全局导出一点都不好。

  2. 再次在与 相同的过程中source_bash_file,将当前保存env到文本文件,并使用 Java 手动解析。

    问题:这可以完成工作,但远不如System.getenv(). 用 Java 编写解析器似乎也很棘手。

  3. 找出 Java 的 bash 环境在哪里实例化(可能在 java.System.lang 中)并修改以在初始化 Java 环境source bash_file 之前执行,因此我的 Java 应用程序继承了这些变量。

    问题:这似乎是我所有选项中最混乱的一个,我不知道从哪里开始寻找 Java 的 shell 环境的初始化。

有什么方法可以source从 Java 执行类似 bash 的操作,或者,获取该功能的最简单实现是什么?在评估可能的行动方案时,我也表达了一些不确定性,如果有人能向我补充这些不确定性,我将不胜感激。

谢谢!

4

1 回答 1

2

不,没有在 Java 中运行 bash 代码的通用方法。但是通过 shell 脚本调用 Java 程序是很常见的;你确定你的还没有那样工作吗?如果是这样,那是在执行程序之前获取其他 bash 文件的最直接的地方。

如果由于某种原因这不是一个选项,那么#2 是最好的解决方案。#1 和 #3 不好;您不希望仅仅为了能够运行该程序而更改系统范围或帐户范围的设置 - 特别是如果您计划让其他人使用它。

#2 选项的解析不需要很复杂。只需使用内置函数或类似方法输出环境变量set,然后在您的 Java 解析器中一次读取一行并=在每行的第一个符号处拆分。如果变量包含换行符,bash 应该将它转义在一个美元引号字符串中,这可能会混淆您的解析,但您可能不需要担心嵌入的换行符,因此将结果视为垃圾。您可能还想取消引用 or 中包含的值''""甚至可能在第二种情况下处理反斜杠转义,但在大多数情况下,不需要反斜杠解析。

于 2012-07-12T18:13:01.723 回答