【发布时间】: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