在java中运行内部和外部unix命令之间的区别

时间:2009-02-18 17:40:02

标签: java unix

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

请帮助解释。

4 个答案:

答案 0 :(得分:7)

因为它们是内置于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破坏。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

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

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