【发布时间】:2009-02-18 17:40:02
【问题描述】:
为什么内部 unix 命令(cd、pwd 等)不能像使用 Runtime.getRuntime().exec() 的外部命令(chmod、chown 等)一样直接在 java 中运行?
请帮忙解释一下。
【问题讨论】:
为什么内部 unix 命令(cd、pwd 等)不能像使用 Runtime.getRuntime().exec() 的外部命令(chmod、chown 等)一样直接在 java 中运行?
请帮忙解释一下。
【问题讨论】:
因为它们是内置在 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 包含任何空格,我们的命令将被破坏。
【讨论】:
Java 需要一个可执行文件来执行。这就是为什么 shell 内置命令(例如 cd、bg、别名)在 Java 中不起作用的原因。内置命令不是实际的可执行文件,而是当 shell 在命令行或脚本中遇到它们时由 shell 简单地解释。
您可以通过编写包含内置命令的 shell 脚本然后从 Java 应用程序执行 shell 脚本来解决此问题。
【讨论】:
/bin/sh -c cd /home/,但它什么也没做。它只是改变了shell进程的密码,然后立即退出。
【讨论】:
其他人提供了基本原因,但他们并没有真正解释为什么会这样。
shell 命令cd 和pwd 是shell 内部的,因为它们影响或报告shell 的内部状态。
这里的两个示例都在“工作目录”上工作,它是 shell 内部状态的一部分,尽管环境变量 PWD 也会保持最新状态,包含少量信息。
要在您的程序中实现相同的效果,您需要更改或访问您的进程的内部状态。获取和设置环境变量 PWD 的状态将是一种合理的,如果是独特的方式来完成此操作。
【讨论】: