Java的ProcessBuilder在哪里执行命令?

当我使用ProcessBuilder执行命令时,它如何知道在哪里查找该命令? 使用这个hack /技巧我修改了我的PATH变量(通过检查processBuilder.environment()validation)是坏的(空的,工作目录等)但是ProcessBuilder仍然可以执行sort,echo,bash等等。 它是怎么做到的?!

注意:我的特定开发环境是OSX,但此代码也将在Red Hat Enterprise Linux上运行。

文件说

[…]一个命令,一个字符串列表,表示要调用的外部程序文件及其参数(如果有)。 哪个字符串列表表示有效的操作系统命令取决于系统。 […]

这实质上意味着它查找要执行的程序取决于您正在运行的特定系统和JVM。

我找不到完整的JVM / System行为矩阵,但据说它的行为类似于系统的流行shell( bash for * nix和cmd for windows),即它从左到右搜索PATH环境变量中的目录并执行它找到的第一个可执行文件。

如果你想控制找到命令,那么,控制好找到命令。 不要让ProcessBuilder搜索。 使用您自己的代码查找要运行的内容,然后将绝对路径名放入ProcessBuilder的参数中。