2008-10-02 32 views
19

我想使用字符串作爲輸入來調用bash。就像:在getRuntime()中使用引號exec

sh -l -c "./foo" 

我想從Java做到這一點。不幸的是,當我嘗試調用使用getRuntime().exec的命令,我收到以下錯誤:

 foo": -c: line 0: unexpected EOF while looking for matching `"' 

     foo": -c: line 1: syntax error: unexpected end of file 

這似乎與我的字符串而終止與EOF。

有沒有辦法將特定於平臺的EOF插入到Java字符串中?或者我應該尋找另一種方法,比如在調用「sh」之前寫入臨時腳本?

+0

在編譯時或運行時是否出現錯誤? – 2008-10-25 02:49:35

回答

39

使用此:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"}); 

主要點:寫在shell命令行的時候不要把雙引號,這只是使用!

例如,echo "Hello, world!"(如鍵入的外殼)被翻譯成:

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"}); 

(只是忘記了殼通常有echo一個內置的,並呼籲/bin/echo而不是時刻:-) )

4

EOF不是字符,所以沒有辦法寫EOF。 您忘記關閉帶引號的字符串。

0

此錯誤的原因很可能是bash期望的缺少語法標記,但在bash遇到它之前,您傳遞的字符串已結束。尋找沒有關閉或完成的ifs,fors等。

0

引號需要在字符串內部轉義。 而不是寫「寫」。

E.g.

strcpy(c,「This is a string \」with \「quotes」);

7

Windows命令行與UNIX,Mac OS X和GNU/Linux不同。

在Windows上,進程接收可執行名稱(和空格)後的輸入文本。然後由程序來解析命令行(這通常是隱含的,程序員常常無能爲力)。

在GNU/Linux中,shell處理命令行並傳遞傳遞給C的主字符串的熟悉的數組。你沒有那個外殼。最好的方法(即使在Windows上)是使用exec的形式,在每個命令行參數中分別傳遞自己的字符串。

如果你真的想要的話,你可以爲你解析一個shell。這將使你例子看起來像(未經測試):

Runtime.getRuntime().exec(new String[] { 
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\"" 
}); 
0

如果我是你,我會寫字符串到一個臨時bashfile的內容,看看是否bash的執行,沒有任何錯誤。如果執行沒有錯誤,那麼我會考慮進一步調試;

相關問題