Java Runtime.getRuntime().exec() 似乎正在覆盖 $PATH

2023-12-06

对于一个自动化一些突变充分性测试的项目,我正在尝试从 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 上。


Runtime.exec 被替换为流程构建器十二年前,作为 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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Runtime.getRuntime().exec() 似乎正在覆盖 $PATH 的相关文章

随机推荐