为什么内部unix命令(cd,pwd等)不能像使用Runtime.getRuntime()。exec()的外部命令(chmod,chown等)直接在java中运行?
请帮助解释。
答案 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命令cd
和pwd
是shell的内部命令,因为它们会影响或报告shell的内部状态。
这里的两个示例都在“工作目录”上工作,这是shell的内部状态的一部分,尽管环境变量PWD
也保持最新的瘦信息。
要在程序中实现相同的效果,您需要更改或访问 进程的内部状态。获取和设置环境变量PWD
的状态将是一种合理的,如果是非混合的方式来实现这一点。