爲什麼不能像使用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