为什么不能像使用Runtime.getRuntime()一样在外部命令(chmod,chown等)中直接在java中运行内部unix命令(cd,pwd等)。exec ()?在java中运行内部和外部unix命令之间的区别
请帮忙解释。
为什么不能像使用Runtime.getRuntime()一样在外部命令(chmod,chown等)中直接在java中运行内部unix命令(cd,pwd等)。exec ()?在java中运行内部和外部unix命令之间的区别
请帮忙解释。
Java需要一个可执行文件来执行。这就是为什么shell内置命令(如cd,bg,别名)不能在Java中工作的原因。内置命令不是实际的可执行文件,而是在shell在命令行或脚本中遇到它们时由shell简单地解释。
您可以通过编写包含内置命令的shell脚本,然后从Java应用程序执行shell脚本来解决此问题。
你能执行一些类似于“/ usr/bin/sh cd/home /”吗? – OscarRyz 2009-02-18 17:47:53
因为它们是内置在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是否包含任何空格。
您可能需要阅读"When Runtime.exec() Won't".
其他人提供的基本原因,但他们并没有真正解释为什么这应该是这样的。
shell命令cd
和pwd
位于shell的内部,因为它们会影响或报告shell的内部状态。
尽管环境变量PWD
也与最新的瘦信息保持同步,但这里的两个例子都在“工作目录”上工作,该工作目录是shell内部状态的一部分。
要在程序中实现相同的效果,您需要更改或访问内部状态过程。获取和设置环境变量PWD
的状态将是一个合理的,如果unixish方式来实现这一点。
泄漏抽象的另一个例子:http://www.joelonsoftware.com/articles/LeakyAbstractions.html – Pyrolistical 2009-02-18 17:50:26