java - Runtime.getRuntime().exec(String command, String[] envp, File dir) API On Mac OSX 无法正确使用提供的环境
问题描述
当我在Mac OSX (Catalina 版本 10.15.4 )上使用public Process exec(String command, String[] envp, File dir) API时,子进程没有获得正确的环境变量传递。这有点奇怪,如果 env[] 字符串包含正确传递给子进程的任何已定义的新环境变量,但是修改了现有变量值并将例如 PATH 传递给新值,那么子进程不会获得修改后的值,它得到预先存在的值。
重要说明 这只发生在 Mac OSX、 windows 和 Linux 上,这工作得很好。
下面是我正在使用的代码片段
StringBuilder cmd = new StringBuilder();
cmd.append("/usr/bin/open ");
cmd.append("-F -n -a ");
cmd.append("Terminal.app ");
cmd.append(workingDir);
String[] env = new String[5];
env[0]= "PATH=" + "/home/xxtest/temp"+ ":" + System.getenv("PATH");
env[1]= "SYSTEM=" + "/home/xxtest/install/testsystem";
env[2]= "CORE=" + "testcore";
try {
Runtime.getRuntime().exec(cmd.toString(),env,workingDir);
} catch (IOException e) {
}
现在当终端应用程序打开并且我检查环境变量时
mac-jup4:onp6 poonamg$ printenv
TERM_PROGRAM=Apple_Terminal
TERM=xterm-256color
SHELL=/bin/bash
TMPDIR=/var/folders/1l/4vsmgmmx1k364y5_j0km08006clg6j/T/
TERM_PROGRAM_VERSION=433
TERM_SESSION_ID=D3D3FDC1-D065-432F-BDF5-73D548AD6462
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.tWljT5bOon/Listeners
SYSTEM=/home/xxtest/install/testsys
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Library/Apple/usr/bin
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0
CORE=testcore
LC_CTYPE=UTF-8
DISPLAY=/private/tmp/com.apple.launchd.EHe3TVLbtI/org.macosforge.xquartz:0
mac-jup4:onp6 poonamg$
您可以看到CORE、SYSTEM环境变量,但PATH未更新
任何线索为什么会在 OSX 上发生这种情况?
解决方案
推荐阅读
- hibernate - 如何在@Embeddable 中使用@GeneratedValue 作为复合主键?
- python - 如何使用 Selenium 动态更改 Firefox 无头模式?
- python - 如何从两个列表中删除相同的单词?
- sql - Oracle SQL 查询 - where 子句以某些值开始和结束
- airflow - 一个任务可以依赖于 Airflow 中的多个 ShortCircuitOperator 任务吗?
- c# - System.Numerics.Vector
仅部分初始化 - java - 我不知道如何使用 JButton Action
- java - 添加到授予权限后未立即执行的联系人
- python - 如何并行启动函数,检查它们是否完成,并在python中启动一个新函数?
- swift - 如何将字符串传递给 SKScene(filenamed:) 动画文件中的 SKLabelNode?