【问题标题】:Where does Java's ProcessBuilder look to execute commands?Java 的 ProcessBuilder 在哪里执行命令?
【发布时间】:2012-03-11 05:43:24
【问题描述】:

当我使用ProcessBuilder 执行命令时,它如何知道在哪里查找该命令?使用this hack/trick 我已将我的PATH 变量(通过检查processBuilder.environment() 进行验证)修改为坏的(空的、工作目录等),但ProcessBuilder 仍然可以执行排序、回显、bash 等。这是怎么做到的?!

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

【问题讨论】:

    标签: java path command processbuilder


    【解决方案1】:

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

    【讨论】:

    • 我正在尝试为使用 ProcessBuilder 执行“排序”的东西编写单元测试,它希望 ProcessBuilder 进行搜索。我只是想模拟未找到的排序。
    【解决方案2】:

    文档说

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

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

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

    【讨论】:

    • 我看到你找到了我的后续问题:-P 为了澄清我在 OSX 上运行并想知道是否有任何方法可以修改它的外观。
    • 嗯.. 打败了我。让我们拭目以待,看看是否有人过来回答这个问题。除了 PATH 变量之外,ProcessBuilder 似乎还必须有一些回退机制。
    • 1.7.0_51 在 OSX 上,我无法让它查看 PATH。只有构造函数中的完整路径有效
    猜你喜欢
    • 2014-03-14
    • 2023-03-11
    • 2017-03-07
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多