【问题标题】:Java Runtime.getRuntime().exec() appears to be overwriting $PATHJava Runtime.getRuntime().exec() 似乎正在覆盖 $PATH
【发布时间】:2017-04-13 22:05:09
【问题描述】:

对于一个自动化一些突变充分性测试的项目,我正在尝试从 Java 程序内部的源代码制作 GoLang。我已经能够从终端中的源代码实现它,并尝试在 Java 的 Runtime.getRuntime().exec() 命令中使用该命令:

String[] envp = new String[3];
envp[0] = "CC=/usr/bin/clang";
envp[1] = "GOROOT_BOOTSTRAP=/usr/local/go";
envp[2] = "CGO_ENABLED=0";
Runtime.getRuntime().exec("./all.bash", envp, "$HOME/Desktop/go/src");

与此等效的命令在终端中可以正常工作。在 java 中运行此代码(并打印输出)得到以下结果:

./all.bash
##### Building Go bootstrap tool.
cmd/dist
go tool dist: FAILED: uname -r: exec: "uname": executable file not found in $PATH

所以它找不到uname 很奇怪。同样,如果我在终端上输入'uname',它工作正常。所以我找到了uname 的目录('which uname' 给了'/usr/bin/uname')并将$PATH 设置为这个命令:

String[] envp = new String[4];
envp[0] = "CC=/usr/bin/clang";
envp[1] = "GOROOT_BOOTSTRAP=/usr/local/go";
envp[2] = "CGO_ENABLED=0";
envp[3] = "PATH=/usr/bin";
Runtime.getRuntime().exec("./all.bash", envp, "$HOME/Desktop/go/src");

然后得到输出:

./all.bash
env: bash: No such file or directory

所以当我设置路径时,在目录中找不到程序。这向我表明,当调用 Runtime.getRuntime().exec() 时,它会覆盖 $PATH 成为我传递给它的目录,然后覆盖我给它的环境变量。但是为了让./all.bash 工作,我需要两条路径都在$PATH 变量中。我该怎么做?

在 Mac OS X 10.11.6 上。

【问题讨论】:

  • envp 不是要添加到环境中的变量,而是要设置环境的变量。除您指定的变量外,不会在该过程中提供任何其他变量。 覆盖了PATH。
  • 哦,好的。因此,如果我希望它也能够在我给它的目录中执行 ./all.bash ,我是否也必须将该目录添加到 $PATH 中?像“PATH=/usr/bin:$HOME/Desktop/go/src”?或者类似的东西,导致同样的错误。
  • 获取路径并通过System.getenv().get("PATH") 可能最简单
  • 成功了!谢谢你。但是其中两个测试失败了,当我在终端中运行时它们也没有。具体来说,'os/signal' 表示 Current 未实现,并且 'runtime' 超时。我想我必须打开一个新问题才能得到答案。

标签: java path environment-variables exec


【解决方案1】:

Runtime.exec 在十二年前被 ProcessBuilder 取代,作为 Java 1.5 的一部分。

它的众多卓越功能之一是能够添加到现有环境中:

ProcessBuilder builder = new ProcessBuilder("./all.bash");
builder.inheritIO();

builder.directory(
    new File(System.getProperty("user.home") + "/Desktop/go/src"));

builder.environment().put("CC", "/usr/bin/clang");
builder.environment().put("GOROOT_BOOTSTRAP", "/usr/local/go");
builder.environment().put("CGO_ENABLED", "0");

builder.start();

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多