2009-06-26 2 views
1

아래의 Java 코드는 Unix (AIX와 Linux 모두)에서 실행되지만 작동하지 않습니다. 이 코드를 실행하면 q1.01 파일이 압축되지 않고 예외가 발생하지 않습니다 (q1.01 파일이 있고 명령을 실행 한 후 q1.01.Z 파일을 찾으려고합니다). "which compress"라고 입력하면 명령 프롬프트가 "/ usr/bin/compress"와 함께 다시보고됩니다. Unix 프롬프트에서 "/ usr/bin/compress q1.01"명령을 입력하면 올바르게 작동합니다. 무엇이 잘못 되었을지에 대한 아이디어가 있습니까?Unix에서 Java exec

String cmd = "/usr/bin/compress q1.01"; 
Runtime.getRuntime().exec(cmd); 
+1

Java가 아닌 셸을 통해 명령을 실행할 때 파일이 압축됩니까? – jimyi

+0

Java가 프로그램 디렉토리에서 q1.01을 찾고있을 수 있습니다. 파일에 대한 전체 파일 경로를 제공하려고 시도 했습니까? 또한 시스템에서 압축 된 파일을 찾을 수 있는지 확인하십시오. –

+0

아마도 exec()가 반환 한 Process 개체에서 stdout/stderr 스트림을 읽을 수 있습니다. 그게 효과가없는 이유를 알 수 있습니다. –

답변

0

파일의 절대 경로를 사용해야 할 수도 있습니다. 출력을 캡처하여 문제가 무엇인지 확인하십시오. 수행 방법에 대한 정보는 this page을 참조하십시오.

0

This 사이트에서 단서를 제공 할 수 있습니다.

2

[나중에 편집 : 문제는 초기 설명에있었습니다. OP는 q.01이 아닌 와일드 카드를 전달했습니다. 그래서 내 대답은 아래 부분을 굵게 제외하고 잘못되었습니다. 그 다음에 주석이 의미가있을 것입니다.]

인수없이 프로그램 이름으로 /usr/bin/compress을 실행하려고합니다.

Runtime.exec() 메소드에는 다양한 형식이 있습니다. 실행 파일을 사용하는 .exec(String) 버전을 사용 중입니다. 대신, .exec(String[]) 배열 버전을 사용해야합니다.이 버전은 String [0]의 실행 파일과 String [1 ..]의 매개 변수를 사용합니다.

.exec()는 인수를 전달하기위한 문자열 배열을 원합니다.

는 .exec 로컬 명령 셸을 호출하지 않는

String[] cmd = new String[] { "/usr/bin/compress", "q1.01" }; 
Runtime.getRuntime().exec(cmd); 

참고하십시오. 즉, 우리는 와일드 카드 확장과 심지어는 의 일부 구문 분석을 수행해야하며, .exec()를 호출해야합니다. 이것이 전체 커맨드 라인을 전달할 수없는 이유입니다.

+0

다음과 같이 런타임 # exec (String) 메소드 설명서를 해석하지 않습니다. http://java.sun.com/javase/6/docs/api/java/lang/Runtime.html#exec(java.lang). String, % 20java.lang.String [], % 20java.io.File)은 StringTokenizer 클래스를 사용하여 인수가 토큰으로 분리되었음을 나타냅니다. – JesperE

+0

확인 됨. 런타임 # exec (String)는 실제로 인수를 분할합니다. Runtime.getRuntime(). exec ("nslookup www.stackoverflow.com")을 시도하십시오. – JesperE

+0

아! 나는이 형태의 exec 메소드를 시도했지만, 인수로 "* .01"을 사용했고 쉘을 통과하지 않았기 때문에 확장되지 않았습니다. 감사! –

0

프로세스 입력 스트림이 null 인 경우 Java에서 하위 프로세스를 생성 할 수 없다고 생각됩니다. Process # exitValue()는 무엇을 반환합니까?

strace을 사용하여 실제로 시스템 호출 수준에서 어떤 현상이 발생하는지 확인하는 것이 좋습니다. 실제 exec() 인수와 리턴 코드는 특히 흥미로울 것입니다.

+0

프로세스 입력 스트림이 null이 아니며, null을 반환하는 스트림의 readLine입니다. 그것이 실행될 때 분명히 출력이 없습니다. –

+0

많은 유닉스 프로그램은 성공했을 때 출력을 전혀 표시하지 않습니다. – JesperE

1

몇 가지 문제가있었습니다. 하나는 와일드 카드를 사용하여 시도한 것이고, 쉘이 호출되지 않았기 때문에 확장되지 않았기 때문입니다. 다른 문제는 내가 이렇게 아주 작은 테스트 파일을 만들었다는 것입니다 : "echo 'abc'> q1.01". 이 파일은 너무 작아서 압축 할 수 없으므로 혼자 남겨 두었습니다. (어리석게도 쉘에서 명령을 입력 할 때 압축 된 다른 파일 이름을 사용했다고 생각합니다.)

답장을 보내 주셔서 감사합니다. 그것은 도움이되었다!

관련 문제