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

标签 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.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 被 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();

关于Java Runtime.getRuntime().exec() 似乎正在覆盖 $PATH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40873863/

相关文章:

python - 您可以在以数字开头的文件上使用 os.path.exists() 吗?

cmd - 使用cmd获取没有系统路径的当前用户路径变量

java - 我需要将一个 int 变量转换为 double

java - 将 spring boot 从 2.1.0 升级到 2.2.2.RELEASE ,现在启动时出现异常

java - 从整数中删除第 n 个数字而不转换为字符串

python - pathlib.Path().glob() 和多个文件扩展名

linux - Linux 中的绝对路径(文件路径中有空格)

bash - 我可以在不获取变量的情况下将变量从 Bash 脚本导出到环境吗?

docker-compose env 文件在 yml 中工作但不使用命令行参数

Multimap 中的 Java 泛型删除