【问题标题】:Java Runtime exec() does not resolve environment variableJava Runtime exec() 不解析环境变量
【发布时间】:2020-06-03 03:13:03
【问题描述】:

如果我在终端中运行以下命令,我会得到预期的 123

$ /bin/sh
$ FOO=123
$ echo $FOO
123

现在我尝试使用 Java 的 Runtime's exec() 执行以下操作:

String[] envp = { "FOO=123" };
String   cmd  = "echo $FOO";
Process  p    = Runtime.getRuntime().exec(cmd, envp);
java.io.BufferedReader reader = 
    new java.io.BufferedReader(
        new java.io.InputStreamReader(p.getInputStream()
    )
);
System.out.println(reader.readLine());

我希望看到123,但我却得到了$FOO

我错过了什么?

【问题讨论】:

    标签: java linux exec


    【解决方案1】:

    以下工作在 Windows 下。

    String[] envp = { "FOO=123" };
    String   cmd  = "cmd /c echo %FOO%";
    Process  p    = Runtime.getRuntime().exec(cmd, envp);
    p.waitFor(); 
    java.io.BufferedReader reader = 
        new java.io.BufferedReader(
            new java.io.InputStreamReader(p.getInputStream()
        )
    );
    String line; 
    while((line = reader.readLine()) != null) { 
        System.out.println(line);
    }
    

    【讨论】:

      【解决方案2】:

      我错过了什么?

      首先,

      $ FOO=123
      

      设置一个shell变量。它是 shell 本地的。如果你想让一个变量在子进程看到的环境中,你必须export它。

      $ export FOO=123
      

      但这不是问题所在。

      真正的问题是命令字符串"echo $FOO"。问题是$FOO 是shell 语法....但是当您使用exec 从Java 运行命令时:

      • exec 本身不懂 shell 语法,而且
      • exec 不在 shell 中运行命令。

      因此,echo 命令的参数由文字字符串$FOO 组成......这就是它输出的内容。

      有三种方法可以解决这个问题:

      1. 在Java中对变量进行插值;例如

          String[] cmd = {"echo", "123"};
          Process p = Runtime.getRuntime().exec(cmd);
        

        或者通过重复搜索/替换看起来像变量的东西。 (但这仅涉及环境变量插值,而不涉及其他形式的 shell 替换。)

      2. 假设您正在执行比echo 更复杂的操作,请编写您正在运行的命令来执行自己的环境变量插值。 (这很笨重...)

      3. 在 shell 中显式调用命令;例如

          String[] envp = {"FOO=123"};
          String[] cmd = {"/bin/sh", "-c", "echo $FOO"};
          Process p = Runtime.getRuntime().exec(cmd, envp);
        

        请注意,您可以使用任何 shell,并提供几乎任何可以在单个 shell 命令行中表达的 shell-ism。

      【讨论】:

      • 我正在根据文档通过 Java 设置 ENV 变量。它在传递给新进程时被隐式导出。不确定您希望我如何明确导出它?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      相关资源
      最近更新 更多