2013-07-02 3 views
1

일부 사용자 입력 변수를 가져 와서 perl 스크립트에 전달하는 Java 프로그램을 작성하려고합니다. 실제로는 perl 스크립트에서 특정 문자열을 찾아서 사용자로 바꿉니다 - 입력 변수). 다음은 코드입니다.Java 프로그램에서 UNIX 명령을 실행할 수 없습니다.

String sedMain = "sed -e "; 
    String sedFirstLine = "'s/AAA/"+newFirstLine+"/' -e "; 
    String sedNewCntr = "'s/BBB/"+newCntr+"/' -e "; 
    String sedNewSpacing = "'s/SPACE/"+newSpacing+"/' -e "; 
    String sedNewDmax = "'s/MAX/"+newDmax+"/'"; 
    String sedFile = " /filepath/myperlscript.pl > /filepath/myNEWperlscript.pl"; 
    String sedCommand=sedMain+sedFirstLine+sedNewCntr+sedNewSpacing+sedNewDmax+sedFile; 
    System.out.println("SED COMMAND: "+sedCommand); 
    String testRun = "touch /filepath/hello.txt"; 
    Process runSedCommand; 
    runSedCommand = Runtime.getRuntime().exec(sedCommand); 

나는 IDE를 사용하고 있으며, sed 명령이 콘솔에 인쇄되면 올바르게 표시됩니다. 콘솔에서 sed 명령을 복사하여 터미널에서 실행하면 작동했습니다. Java에서 Process에 문제가 있는지 "testRun"이라는 문자열을 작성하고 "hello.txt"파일을 작성했습니다. 그러나 어떤 이유로 든 내 프로그램은 출력 perl 파일 "myNEWperlscript.pl"을 만들지 않습니다. 왜 이것이 작동하지 않는지에 관해서는 혼란 스럽다. 누구든지 도와 줄 수 있습니까?

+0

exec()는 프로그램 이름과 매개 변수를 요소로 사용하여 String []을 가져 오지만 모두 단일 문자열로 연결하므로 효과적으로 인수가 손실됩니다. –

+0

그래서 모든 요소를 ​​포함하는 하나의 문자열을 작성해야합니까? –

+0

아니요, 문자열 배열을 만들 필요가 있습니다 –

답변

3

exec()는 프로그램 이름과 매개 변수를 요소로 사용하여 String []을 취하지 만 모든 것을 하나의 String으로 연결하므로 효과적으로 인수가 손실됩니다. 이 같은

시도 뭔가 :

String[] cmd = {"sed", "first argument", "second argument"}; 
Runtime.getRuntime().exec(cmd); 
+0

고마워요! 조금 조정하면 효과가 있습니다. –

2

exec(String[] cmdarray) 

서명을 사용합니다. 명령은 sed이고, -e는 매개 변수이고, s/AAA/\ n /는 다른 매개 변수입니다. 문자열의 첫 번째 토큰이 단지로 간주됩니다 후 그래서 그렇지 않으면 이상한 sruff 어떤 따옴표로 일어날 수 있습니다, 이것은 당신의 매개 변수를 잘 쉘에 그것의 방법에 서식 얻을 수있는 유일한 방법입니다

String[] command = new String[] {"sed", "-e", "s/AAA/\n/", "next parameter without single quotes", , "next parameter without quotes..."} 
Runtime.getRuntime.exec(command); 

이있을 것이다 하나의 매개 변수와 따옴표를 이스케이프 처리 할 수 ​​있습니다.

+0

실제로 실행 된 명령이 셸이 아닌 경우에는 셸이 관련되지 않습니다. –

+0

JVM에서 하위 프로세스를 생성하는 방법은 무엇입니까? –

+1

커널에 시스템 호출을 발행합니다. 쉘은 필요하지 않습니다. 쉘은 프로그램을 시작하고, 입력과 출력 파이프를 함께 묶는 등의 편의성을 제공하지만 궁극적으로 가능한 한 커널에 대한 시스템 호출을 사용하는 프로그램입니다. 예를 들어,이 질문에서 sed의 출력을 파이프하려고 시도하는 것은 쉘을 가졌지 만 아무 것도 호출되지 않는 것에 달려 있습니다. 따라서 포스터는 sed의 출력을 파일로 캡처하거나 쉘을 실행하여 sed를 시작하고 출력을 파일로 파이프해야합니다. –

관련 문제