2012-10-12 68 views
1

我有一個Java機器人,我正在從一個用戶通過IRC消息獲取輸入。用戶鍵入類似於.host file = foo file = bar hostname =「這是一個名稱」,並且它將根據它們的輸入爲它們啓動服務器。在java中動態創建和執行bash命令的最佳方法?

現在我有一個方法,基本上解析他們的消息,尋找主機名=「」(必須用引號封裝),拆分主機名=部分,並設置主機名爲他們的結果是什麼(例如,主機名=「這是一個名字」將成爲-hostname'這是一個名字')。我正在使用正則表達式來做到這一點。

然後,我將字符串拆分成一個數組(用空格分隔)並將信息傳遞給processbuilder,它在它自己的線程中執行該命令。最後的命令看起來是這樣的:

./server -HostName「這是一個名爲」

我遇到的問題是,因爲我是用空格分割,如果用戶在添加了一個破折號主機名(例如,hostname =「這是 - 一個名稱」),它會認爲短劃線指的是一個參數,並且基本上將其餘部分砍掉。

進一步說明:processbuilder將按空格拆分它會通過「-hostname」,「this」,「is」,「 - 」,「a」,「name」這是我遇到麻煩的地方,因爲 - 意思是我應該傳遞一個參數,但那不是我正在使用它。

什麼是最有效的方式來實現這一點,以便任何字符傳遞只是字面上這個字符?我不應該在空間分裂嗎?如果我從linux外殼運行./server -hostname「這是 - 一個名字」,它將運行良好。

我感謝任何和所有的幫助。謝謝!

+0

一個試圖使Runtime.exec不那麼痛苦的項目。不確定這是最好的方式,但閱讀源代碼可以幫助您瞭解如何與Runtime.exec進行交互:https://github.com/RasmanTuta/exec-utils/tree/master/exec-utils/src/main/java/examples – ebaxt

+0

幾乎是一個重複:http://stackoverflow.com/questions/4916918/java-execute-a-command-with-a-space-in-the-path-name – noahlz

+0

我認爲他們是非常不同的。我已經通過Mikel的建議將字符串分割成一個數組。我遇到的問題是,由於命令是動態的,因此確保 - 不會被解釋爲我試圖傳遞參數,而是字面上的字符' - '。 –

回答

3

Runtime.exec和ProcessBuilder都會帶有一個命令列表。

Runtime.exec(new String[]{"./server", "-hostname", "this is - a name"}; 
ProcessBuilder pb = new ProcessBuilder("./server", "-hostname", "this is - a name"); 

這基本上意味着,每個元素傳遞給命令(第一個參數)作爲單獨的參數,這樣你不必擔心像空間和多餘的字符。

0

我決定徹底改變我的代碼,並使用正則表達式來解析來自用戶的輸入,而不是先前的方法和空間分割。這意味着我可以簡單地將輸入添加到Arraylist中,作爲完整的「+ sv_hostname =」test - name「」而不是「+ sv_hostname」,「test」,「 - 」,「name」。

+0

http://commons.apache.org/cli/ – djangofan