Java Runtime.getRuntime().exec()似乎正在覆盖$PATH
对于一个自动化一些变异充分性测试的项目,我试图从Java程序中的源代码生成GoLang。我已经能够在终端中从源代码创建它,并尝试在Java的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
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()!非常感谢。但是有两个测试失败了,当我在终端上运行时,它们没有失败。具体来说,“操作系统/信号”表示当前未实现,“运行时”超时。不过,我想我必须提出一个新问题才能得到答案。