当我使用
ProcessBuilder
执行命令时,它如何知道在哪里查找该命令? 使用 this hack/trick 我已经将我的 PATH 变量(通过检查 processBuilder.environment()
验证)修改为不好的(空、工作目录等),但 ProcessBuilder 仍然可以执行排序、echo、bash 等。 这是怎么做到的?!
注意:我的特定开发环境是 OSX,但此代码也可以在 Red Hat Enterprise Linux 上运行。
文档说
[...] 一个命令,一个字符串列表,表示要调用的外部程序文件及其参数(如果有)。哪些字符串列表代表有效的操作系统命令取决于系统。 [...]
这本质上意味着它在哪里寻找要执行的程序取决于您正在运行的特定系统和 JVM。
我找不到 JVM/系统行为的完整矩阵,但据说它的行为类似于系统的流行 shell(*nix 为
bash
,windows 为 cmd
),即它搜索 PATH
中的目录
从左到右环境变量并执行它找到的第一个可执行文件。
如果您想控制查找命令,那么,好吧,控制查找命令。不要让
ProcessBuilder
搜索。使用自己的代码找到要运行的内容,然后将绝对路径名放入参数中即可ProcessBuilder
。
对于类似 UNIX 的操作系统,将搜索父级的路径。源码 openjdk childproc.c:
/* We must search PATH (parent's, not child's) */
流程如下:
parentPathv
调用 native 方法设置
PATH
。这意味着任何没有确切路径的可执行文件都将在
parentPathv
中搜索,它来自 Java 进程的 PATH
值,而不是配置为 PATH
一部分的 processBuilder.environment()
。