2013-03-30 6 views
0

새 콘솔 창에서 프로세스를 시작해야합니다. Mac의 경우 다음과 같은 것을 발견했습니다 : Running a command in a new Mac OS X Terminal window 여기서 실행할 명령은 문자열로 전달됩니다.자바 프로세스 빌더 빌드 명령

그래서 프로세스 작성기와 같은 String 목록을 제공하는 메서드를 만들어 새로운 콘솔 창에서 주어진 명령을 실행할 문자열 목록 (최종 명령)을 반환합니다. 주어진 문자열에 공백을 붙일 수 있습니다. 대부분 공백이 있지만, 어떻게하면 그걸 제대로 벗어날 수 있습니까? 예를 들어 프로세스 작성자 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

이스케이프 공간이 필요한 이유를 이해하지 못합니다. 우리가 이스케이프 (escape)에 관해 이야기 할 때, 일반적으로 컴파일러/파서 (parser)를 혼동시킬 문자들을 참조합니다. ProcessBuilder가 요구 사항에 맞지 않는 이유는 무엇입니까? 또는 당신의 명령이 너무 복잡하다면, 왜 모든 것을 스크립트에 넣고 그 스크립트를 실행하면 좋을까요? (최소한의 매개 변수가있을 수 있습니다) – user650749

+0

내가 만드는 명령은 사용자 입력에 달려 있습니다. 이 공간은 단지 예일뿐입니다. 기본적으로 나는 쉘 전문가가 아니며 다루어야 할 다른 사례에 대해서는 확신하지 못했습니다. "걱정할 필요가있는 것은 공백이있는 토큰을 따옴표에 넣고 따옴표를 이스케이프 처리해야합니다."라고 말하면, 그렇게 할 것입니다. 내가 더 이해할 수 있을지 확신하지 못한다. – Raekye