2009-11-14 105 views
0

我有一個程序,它調用一個shell命令。當我使用java的run.exec執行命令時,它不起作用,但是當我在終端中直接執行命令時,它的作用就像魅力一樣。命令的java run.exec和shell執行有什麼區別嗎?

ex: pdf2swf "3bbba47.pdf" -T 9 -o "3bbba47.swf" didnt worked 
    from java program but worked directly executing it in terminal. 

但是,當我試圖從命令

pdf2swf 3bbba47.pdf -T 9 -o 3bbba47.swf 

刪除引號它能正常工作在這兩個run.exec和終端。

這是爲什麼?

我在mac和ubuntu上都試過,並以相同的結果結束。

回答

2

run.exec()不調用shell。 shell解析命令行並在將它們作爲參數傳遞給pdf2swf之前有效地刪除引號。您只能使用run.exec()運行「原始」命令。

你可以,如果你願意,運行外殼與run.exec(),並將其解析您的命令shell命令。引用會有點痛苦,但可行。

1

當您在shell中時,引號字符在shell將其提供給JVM之前被解釋。

當你在run.exec,報價被認爲是命令的一部分,所以JVM認爲,你要求[「3bbba47.pdf」]而不是[3bbba47.pdf]

0

來源:http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=1

的Runtime.exec()不是一個命令行

最後一個陷阱以支付與 的Runtime.exec()被錯誤地假設 該EXEC()接受任何的字符串 您的命令行(或殼)接受。 Runtime.exec()更受限於 而不是跨平臺的。此缺陷 是由用戶嘗試使用exec()方法接受單個 字符串作爲命令行所致。 混淆可能是由於 命令是 exec()方法的參數名稱。因此,程序員 錯誤地將參數 命令與他或她 可在命令行上鍵入的任何內容相關聯,而不是將其與關聯單個程序 及其參數的 相關聯。