【问题标题】:Difference between running internal and external unix commands in java在 java 中运行内部和外部 unix 命令的区别
【发布时间】:2009-02-18 17:40:02
【问题描述】:

为什么内部 unix 命令(cd、pwd 等)不能像使用 Runtime.getRuntime().exec() 的外部命令(chmod、chown 等)一样直接在 java 中运行?

请帮忙解释一下。

【问题讨论】:

标签: java unix


【解决方案1】:

因为它们是内置在 shell 中的,而不是它们本身的程序。

最简单的做法是调用 shell 并使用 -c 选项传递命令:

> bash -c pwd
/home/foo/bar/baz

... 或在 Java 中:

Runtime.getRuntime().exec("bash -c pwd")

...或更笼统地说:

Runtime.getRuntime().exec(new String[]{"bash", "-c", command});

我们需要使用 String[] 变体,否则,如果 StringTokenizer 包含任何空格,我们的命令将被破坏。

【讨论】:

    【解决方案2】:

    Java 需要一个可执行文件来执行。这就是为什么 shell 内置命令(例如 cd、bg、别名)在 Java 中不起作用的原因。内置命令不是实际的可执行文件,而是当 shell 在命令行或脚本中遇到它们时由 shell 简单地解释。

    您可以通过编写包含内置命令的 shell 脚本然后从 Java 应用程序执行 shell 脚本来解决此问题。

    【讨论】:

    • 你可以执行类似:“/usr/bin/sh cd /home/”的东西吗?
    • 但问题是我无法从 java 获取 shell 脚本。就像在 unix 上一样,我们将 shell 脚本作为 /bin/ksh> 获取。 ./script 但我想你不能从 java 中获取这样的脚本。
    • 你可以运行/bin/sh -c cd /home/,但它什么也没做。它只是改变了shell进程的密码,然后立即退出。
    • 就是这样!!所以你不能从java永久设置环境变量。它只会在子进程中完成并退出。对吗?
    【解决方案3】:

    您可能想阅读"When Runtime.exec() Won't".

    【讨论】:

      【解决方案4】:

      其他人提供了基本原因,但他们并没有真正解释为什么会这样。

      shell 命令cdpwd 是shell 内部的,因为它们影响或报告shell 的内部状态。

      这里的两个示例都在“工作目录”上工作,它是 shell 内部状态的一部分,尽管环境变量 PWD 也会保持最新状态,包含少量信息。

      要在您的程序中实现相同的效果,您需要更改或访问您的进程的内部状态。获取和设置环境变量 PWD 的状态将是一种合理的,如果是独特的方式来完成此操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-11
        • 2015-05-24
        • 2019-03-16
        相关资源
        最近更新 更多