2009-03-04 5 views
2

test.sh이라는 쉘 스크립트가 /tmp/padm 폴더에 있습니다. 그 쉘 스크립트에서 는 내가 자바 코드를 사용하여 쉘 스크립트를 실행하려고자바를 사용하여 쉘 스크립트를 실행하는 중에 문제가 발생했습니다.

echo "good" 

하나의 문이있다.

String cmd=("/tmp/padm/.test.sh");    
Runtime rt = Runtime.getRuntime(); 
Process pr=rt.exec(cmd); 

그러나 내 문제는 쉘 스크립트의 출력물 인 "good"을 볼 수 없다는 것입니다.

어떻게 스크립트를 실행할 수 있습니까?

+0

쉘 스크립트를 실행하는, 그래서 나는 그것을 추측했다. 내가 잘못 생각하면 다시 편집하십시오. –

답변

1

그래도 작동하지 않습니다. 스크립트의 첫 번째 행에 "해시 뱅 (hash bang)"을 추가하여 스크립트를 해석하는 데 적절한 인터프리터 (예 : bash)를 사용하거나 Java에서 명시 적으로 bash를 통해 실행해야한다고 Linux에 알리는 것이 좋습니다.

+0

이해가 안됩니다 ... 쉘 스크립트에 무엇이 있는지 어떻게 알 수 있습니까? 그는 게시하지 않았습니다 –

+0

String [] cmd = { "cmd.exe", "/ C", "D :/Development/saveReport.bat "} 명령 프롬프트를 열고 teh batach 파일을 실행하십시오. 배치 파일을 실행하는 동안 동일한 작업을해야합니다. –

+0

리눅스 환경에서이 유사점이 있는지 확실하지 않습니다! process.getOutputStream()을 사용하여 프로세스 출력을 가져옵니다. –

1

"터미널에서"라고 말하면 무엇을 의미합니까? 이 과정에서 출력/오류를보고 싶다면 당신이 사용해야합니다 : 그 외에는

process.getErrorStream(); 
process.getOutputStream(); 

를, 내가 쉘 스크립트

+0

터미널과 출력을보아야합니다. –

+0

Sp ielberg 영화 : "터미널"? 아니면 여기 다른 터미널에 대해 이야기하고 있습니까? –

+0

@oxbow_lakes : Windows에서는 명령 프롬프트 창, Linux에서는 쉘 또는 터미널이라고합니다. 같은 것. –

4

당신을 호출 할 Runtime.exec의 사용에서 볼 수있는 문제가 없습니다 다음 코드로 명령 출력을 얻을 수 있습니다. 희망이 도움이됩니다.

Process process = Runtime.getRuntime().exec(cmd); 
String s = ""; 
BufferedReader br = new BufferedReader(new InputStreamReader(process 
      .getInputStream())); 
while ((s = br.readLine()) != null) 
{ 
    s += s + "\n"; 
}  
System.out.println(s); 

BufferedReader br2 = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
while (br2.ready() && (s = br2.readLine()) != null) 
{ 
    errOutput += s; 
} 
System.out.println(errOutput); 
1
process.getErrorStream(); 
process.getOutputStream(); 

oxbow_lakes 지적으로 올바른 접근 방식이다.

또한 쉘 스크립트 위치를 인수로 사용하여 /bin/sh을 exec했는지 확인하십시오.

0

이것은 Need sample java code to run a shellscript의 복제입니다.

내 대답에있는 예제 프로그램은 표준 오류와 표준 출력을 출력합니다 (예제 프로그램은 나중에 추가됩니다).

전체 입/출력 버퍼로 인한 실행 문제를 방지하기 위해 streamGobblers가 별도의 스레드에서 실행됩니다.

물론 StreamGobblers가 목록에 출력을 저장하고 stdout에서 직접 덤프하는 대신 프로세스가 실행 된 후에 목록을 검색 할 수 있습니다.

1

시도해보십시오. 분명히 작동합니다.

쉘 스크립트 test.sh 코드

#!/bin/sh 
    echo "good" 

자바 코드 나는 당신의 질문이 무엇인지 확실하지 않다 test.sh

  try { 
       Runtime rt = Runtime.getRuntime(); 
       Process pr = rt.exec(new String[]{"/bin/sh", "/tmp/padm/.test.sh"}); 

       BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream())); 
       String line = ""; 
       while ((line = input.readLine()) != null) { 
        System.out.println(line); 
       } 
      } catch (Exception e) { 
       System.out.println(e.toString()); 
       e.printStackTrace(); 
      } 
관련 문제