我有一个场景,我有一个在几个平台(特别是 Windows、Solaris 和 AIX)上运行的 Java“代理”。我想通过在我执行的命令行中使用环境变量来排除文件系统结构的差异。
据我所知,无法获取 Runtime.exec()
方法来解析/评估命令字符串(或字符串数组)中引用的任何环境变量。
我知道如果迫在眉睫,我可以编写一些代码来预处理命令字符串并手动解析环境变量(使用 getEnv()
等)。然而,我想知道是否有更聪明的方法来做到这一点,因为我确定我不是唯一想要这样做的人,而且我确定在“敲定”我自己的实现过程中存在缺陷。
非常欢迎您的指导和建议。
编辑: 我想使用一些一致的符号(例如 $VAR 和/或 %VAR%)来引用命令字符串中的环境变量。不介意哪个。
编辑: 明确地说,我希望能够执行如下命令:
perl $SCRIPT_ROOT/somePerlScript.pl 参数
在 Windows 和 Unix 主机上使用 Runtime.exec()
。我在描述要运行的作业列表的配置文件中指定命令,并且它必须能够跨平台工作,因此我认为环境变量对于排除文件系统差异很有用(/home/username/scripts
与 C:\foo\scripts
)。希望这有助于澄清它。
谢谢。 汤姆
最佳答案
我想我在原来的回答中误解了你的问题。如果您尝试在命令行上解析环境变量引用,这些引用是您在 Java 中生成的,我认为您可能必须“自己动手”。
根据操作系统的不同,对于如何扩展它们有许多不同的标准。此外,这通常是 shell 的一个功能,因此即使在同一个操作系统上也可能有不同的方法。事实上,标准操作系统进程激活函数(例如 Unix 中的 exec
)不会进行命令行扩展。
对于 Java 5 及更高版本,这真的没有那么难。为自己定义一个标准,我通常使用您在安全策略文件和一些增强的属性文件定义中看到的 Java 标准 - ${var}
扩展为变量/属性名称引用。像这样的东西:
private static String expandCommandLine(final String cmd) {
final Pattern vars = Pattern.compile("[$]\\{(\\S+)\\}");
final Matcher m = vars.matcher(cmd);
final StringBuffer sb = new StringBuffer(cmd.length());
int lastMatchEnd = 0;
while (m.find()) {
sb.append(cmd.substring(lastMatchEnd, m.start()));
final String envVar = m.group(1);
final String envVal = System.getenv(envVar);
if (envVal == null)
sb.append(cmd.substring(m.start(), m.end()));
else
sb.append(envVal);
lastMatchEnd = m.end();
}
sb.append(cmd.substring(lastMatchEnd));
return sb.toString();
}
关于java - Java 的 Runtime.exec() 运行命令中环境变量的求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2090647/