2009-02-18 65 views
1

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

请帮忙解释。

+0

泄漏抽象的另一个例子:http://www.joelonsoftware.com/articles/LeakyAbstractions.html – Pyrolistical 2009-02-18 17:50:26

回答

2

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

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

+0

你能执行一些类似于“/ usr/bin/sh cd/home /”吗? – OscarRyz 2009-02-18 17:47:53

7

因为它们是内置在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 []变体,否则,我们的命令会被StringTo弄乱kenizer是否包含任何空格。

2

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

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

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

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

相关问题