2012-10-12 2 views
0

내 Java 프로그램이 여러 Unix 기반 시스템에서 echo "text" > /home/maxbester/test.txt 명령을 실행하도록합니다.Java - exec가 쉘처럼 작동하지 않습니다.

private static final Logger LOG = Logger.getLogger(MyClass.class); 
public String run(String cmd) { 
    String res = null; 
    InputStream is = null; 
    try { 
     final Runtime rt = Runtime.getRuntime(); 
     final Process p = rt.exec(cmd); 
     int exitStatus = -1; 
     try { 
      exitStatus = p.waitFor(); 
     } catch (InterruptedException e) { 
      L0G.error(e.getMessage(), e); 
     } 
     is = p.getInputStream(); 

     if (exitStatus == 0) { 
      if (is != null && is.available() > 0) { 
       StringWriter stringWriter = new StringWriter(); 
       IOUtils.copy(is, stringWriter); 
       res = stringWriter.toString(); 
      } else { 
       L0G.error("InputStream is not available!"); 
      } 
     } 
    } catch (SecurityException e) { 
     L0G.error(e.getMessage(), e); 
    } catch (IOException e) { 
     L0G.error(e.getMessage(), e); 
    } 
    return res; 
} 

cmd를이 echo "text" > /home/maxbester/test.txt에 해당하는 경우 및 파일 TEST.TXT가 존재 (, 그리고 echo "text" > /home/maxbester/test.txt가 disapeared 에코) 입술 "text" > /home/maxbester/test.txt를 포함하고있는 test.txt이 비어 : 같은

내 코드 보인다. 그러나 종료 값은 0입니다 (올바르게 작동해야합니다).

나는 수동으로 echo "text" > /home/maxbester/test.txt을 실행합니다. 아무 것도 반환되지 않고 종료 값도 0입니다.

그래서 exec 명령에 어떤 문제가 있습니까?

답변

0

자바로 파일에 텍스트를 쓰려면 스트림 리디렉션과 같은 셸 특정 정보에 의존하는 대신 FileWriter을 살펴 봐야합니다.

+0

사실 특정 모드에서 프로그램은 JSch를 사용하여 원격 컴퓨터에서 작업을 수행합니다. 그래서'setCommand' 메소드 만 사용하여 작업을 할 수 있습니다. 나는 비슷한 행동을 원했다. – Maxbester

0

exec가 쉘처럼 작동하게하려면 쉘을 호출해야합니다. 예 :

String shell = System.getEnv("SHELL"); 
cmd = shell + " -c \"echo test > /home/maxbester/test\""; 

테스트 결과가 stderr로 읽히지 않습니다. 아마도 거기에 흥미로운 것이있을 것입니다.

+0

내 프로그램이 HP-UX 시스템에서 실행 가능해야하며 bash가 시스템에 존재하지 않아야합니다. 예 저는 stderr를 읽기 위해 예제를 업데이트 할 것입니다. – Maxbester

+0

대상 플랫폼이 java를 지원하는 경우 @Peter와 같은 FileWriter를 사용해야합니다. – assafmo

+1

답변을 업데이트했습니다. 모든 쉘이 -c 옵션, echo, redirection 등을 지원해야한다는 것을 잊지 마십시오. FileWriter를 사용해야하는 다른 것에 동의해야합니다. jsch가 아닌 rt.exec를 사용하기 때문에 원격 시스템에서 비슷한 작업을하고 싶을 수도 있습니다. 당신이 무엇을하던간에 그것은 달라질 것입니다. –

관련 문제