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

Java Runtime.getRuntime().exec()似乎正在覆盖$PATH,java,path,environment-variables,exec,Java,Path,Environment Variables,Exec,对于一个自动化一些变异充分性测试的项目,我试图从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.ge

对于一个自动化一些变异充分性测试的项目,我试图从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在12年前作为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();

envp
不是要添加到环境中的变量,而是要设置环境的变量。除您指定的变量外,没有其他变量可用于流程。覆盖路径。哦,好的。因此,如果我希望它也能够在我给它的目录中执行./all.bash,我是否也必须将该目录添加到$PATH中?比如“PATH=/usr/bin:$HOME/Desktop/go/src”?或者类似的东西,因为它会得到相同的错误。可能最简单的方法就是获取路径并通过
System.getenv()!非常感谢。但是有两个测试失败了,当我在终端上运行时,它们没有失败。具体来说,“操作系统/信号”表示当前未实现,“运行时”超时。不过,我想我必须提出一个新问题才能得到答案。