Tom*_*ing 4 java environment-variables
我有一个场景,我有一个Java"代理",可以在几个平台(特别是Windows,Solaris和AIX)上运行.我想通过在我执行的命令行中使用环境变量来分解文件系统结构的差异.
据我所知,没有办法让Runtime.exec()方法来解析/评估命令String(或字符串数组)中引用的任何环境变量.
我知道如果推动推进,我可以编写一些代码来预处理命令String(s)并手动解析环境变量(使用getEnv()etc).但是我想知道是否有一种更聪明的方法可以做到这一点,因为我确信我不是唯一想要这样做的人,而且我确信在"敲定"我自己的实现方面存在缺陷.
非常欢迎您的指导和建议.
编辑: 我想使用一些一致的表示法(如$ VAR和/或%VAR%)来引用命令字符串中的环境变量.不讨厌哪个.
编辑: 要清楚我希望能够执行如下命令:
perl $SCRIPT_ROOT/somePerlScript.pl args
在Windows和Unix主机上使用Runtime.exec().我在配置文件中指定了一个描述要运行的作业列表的命令,它必须能够跨平台工作,因此我认为环境变量可用于分解文件系统差异(/home/username/scriptsvs C:\foo\scripts).希望有助于澄清它.
谢谢.汤姆
我想我用原来的答案误解了你的问题.如果您尝试在使用with-in Java生成的命令行上解析环境变量引用,我认为您可能需要"自己动手".
根据操作系统的不同,有很多不同的标准可以扩展它们.另外,这通常是shell的功能,因此即使在相同的OS上也可能有不同的方式.实际上,标准操作系统进程激活函数(例如exec在Unix中)不执行命令行扩展.
使用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();
    }