2013-03-30 148 views
0

我需要在新的控制檯窗口中啓動進程。對於mac,我發現了這樣的內容:Running a command in a new Mac OS X Terminal window其中要運行的命令以字符串形式傳遞。Java進程生成器生成命令

所以我做了一個給定一個字符串列表(如進程生成器)的方法,返回將在新的控制檯窗口中運行給定命令的字符串列表(最終命令)。我可以在給定的字符串上添加空格,而這些空格在大多數情況下都可以使用,但是我怎樣才能正確地轉義它?例如,我可以通過流程生成器new String[] { "echo", "hello world" },它實際上是echo "hello world"。它也處理很多其他案例(我認爲)。

我想解釋複雜,所以這裏是一個僞存根:

public static String[] getConsoleCommand(String[] command) { 
    if operating system is Mac... 
     String commandString = concatenate command... 
     return new String[] { "osascript", "-e", 
      String.format("'tell application \"Terminal\" to do script \"%s\"'", 
         commandString.replace("'", "\\\'")) // escape single quote used in 'tell application...' 
     }; 
} 

回答

0
import org.apache.commons.lang.StringEscapeUtils; 

for(int i = 0;i <arrayCommand.length();i++) { 
    arrayCommand[i] = StringEscapeUtils.escapeJava(unescapedJava); 
} 
+0

我不認爲與控制檯命令做交易。例如,如果傳遞'Hello world'作爲參數之一,我需要它作爲'Hello \ world'逃脫空間太 – Raekye

+0

我不明白你爲什麼需要逃生空間。當我們談論轉義時,通常是指那些會混淆編譯器/解析器的字符。在你的情況下,爲什麼ProcessBuilder不能滿足你的要求?或者,如果你的命令如此複雜,爲什麼不把所有腳本都放到腳本中,然後運行該腳本(可能是最小參數) – user650749

+0

我創建的命令取決於用戶輸入。空間只是一個例子 - 基本上,我不是殼牌專家,也不知道我需要處理的其他任何情況。如果你說「我需要擔心的是帶有空格的令牌被引用並且引用了他們的引用」,那麼這就行了。不知道我有道理 - 那更清楚? – Raekye