2012-07-03 4 views
4

이 질문은 stackoverflow의 첫 번째 질문이므로 간결하고 관련성이 높은 내용을 유지하려고 노력할 것입니다.Java에서 UNIX 소스 명령 실행

현재 시스템에있는 외부 프로그램을 호출하려고하는 Java 프로그램을 만들고 있습니다. 그러나이를 수행하려면 관련 라이브러리에 대한 링크를 설정하는 쉘 스크립트를 호출해야합니다. 시스템은 외부 프로그램이 실행되기 전에 이들에 링크됩니다.

문제는 내가 자바를 통해 쉘 스크립트를 호출 할 수 없다는 것이고, 나는 높고 낮음을 연구했으며 ProcessBuilder 클래스 사용과 같은 다른 방법을 알고 있음을 알고 있습니다. 불행히도 저는 Java를 통해 명령 줄 명령문을 호출하려는 세계에 새로운 시도를하고 있습니다. 따라서 답변을 얻지 못했습니다.

내가 사용하고있는 코드의 예

아래 찾을 수 있습니다

private void analyse_JButtonActionPerformed(java.awt.event.ActionEvent evt) {             

// Get project path for copying of Fortran program to folder and execution 

String projectPath = Newproject_GUI.getProjectPath(); 


String sourcePath [] = {"/bin/sh ", "-c ","source ~/set_env_WRF_gnu.sh"} ; 



Runtime fortranAnalyser = Runtime.getRuntime(); 

try { 
     Process p = fortranAnalyser.exec("cp main.exe " + projectPath); 
     Process k = fortranAnalyser.exec(sourcePath); 



     BufferedReader is = new BufferedReader(new InputStreamReader(k.getInputStream())); 
     String line; 
     while ((line = is.readLine()) != null) { 

      System.out.println(line); 
     } 


    } catch (IOException ex) { 
     Logger.getLogger(Analyser_GUI.class.getName()).log(Level.SEVERE, null, ex); 
     } 

} 

프로세스 p는 잘 작동하고 수행하는 메서드를 호출 할 때 실제로 의도 한 디렉토리에 메인 .exe를 복사합니다. 프로세스 k 그러나 않습니다 및이 문제가있는 곳입니다.

미리 감사드립니다.

+1

모든 공간이 중요 할 때''-c "'대신''-c"'를 사용해보십시오. –

답변

3

"소스"는 BASH의 내부 명령입니다 ("sh"를 사용하고 있지만 단순화 된 모드에서는 단순한 BASH 임). 그래서 당신이 무엇이다 :

  • 당신이 새로운 프로세스 "쉬"저기 소스 뭔가를 생성하는 프로세스가 종료
  • (일부 같아요 변수를 설정) 모든 변수는
  • 다른 프로세스를 생성 손실되지만, 변수가 이미 사라졌습니다.

나중에 해당 변수를 사용하는 것이 확실하지 않지만 스크립트 이름에 따라 설정하는 것이 좋습니다. 이런 식으로하지 마십시오.

그런데 bash에서 스크립트를 실행하고 싶다면 소스를 지정할 필요가 없습니다. 그것이 부작용의 얻으려면, 그것을 실행하려면

String sourcePath [] = {"/bin/sh ", "/home/XYZ/set_env_WRF_gnu.sh"} ; 

당신이 당신의 홈 디렉토리를 얻기 위해 자바를 사용하여,이 경우에 ~를 사용할 수 있습니다.

+0

그런데, 나는 당신이 GNU Cygwin을 사용할 것을 기대한다. 그렇지 않고 GNU BASH를 사용하지 않는다면, 내가 작성한 내용은 여전히 ​​유효합니다. 다른 유닉스에서 나온 sh는 그런 식으로 작동한다. 그것이 유닉스를 좋아하는 이유입니다. :-) – lzap

+0

예를 들어 프로젝트 경로를 통해 프로젝트 폴더에있는 cd가 main.exe를 실행하려고 시도하는 새 프로세스를 만들려고 시도한 경우 이전 프로세스가 종료 되었기 때문에이 작업은 실패합니다. waitfor() 메서드 나 선을 따라 뭔가 사용해야합니까? –