2010-06-22 2 views
1

내가 친절하게 나에게오류 동안().

도움이 내 자바 프로그램

Runtime.getRuntime().exec("ls -lrt service/logs/post/level2.log | awk '{print $9}'"); 
or 
Runtime.getRuntime().exec("ls -lrt service/logs/post/level2* | awk '{print $9}'"); 

그것이 나에게주는 다음과 같은 오류

 
ls: 0653-341 The file | does not exist. 
ls: 0653-341 The file awk does not exist. 
ls: 0653-341 The file '{print does not exist. 
ls: 0653-341 The file $9}' does not exist. 

에서 다음 명령을 실행하려고 간부 인

답변

9

파이프는 실제 실행 가능한 명령이 아닌 쉘 기반 구조입니다. 이 작업을 수행하는 데는 두 가지 옵션이 있습니다.

  1. Java 내에서 직접 파이핑을 수행하십시오. ls 명령을 먼저 호출하고 OutputStream에 대한 핸들을 가져온 다음 Process의 출력을 두 번째 Process '입력 스트림에 연결하여 awk을 호출합니다.
  2. Java에서 직접 bash 쉘을 호출하여 전체 명령을 bash의 -c 매개 변수에 대한 인수로 전달하십시오. 그런 식으로 모든 배관은 이내에 완료됩니다.

토큰 기반 오류의 경우 문자열 배열로 이러한 명령을 호출해야합니다. 각 요소는 명령 행의 토큰을 나타냅니다. 예를 들어,

Runtime.getRuntime().exec(new String[] { "ls", "-lrt", "service/logs/post/level2.log" }); 

을 입력하여 ls 명령을 호출하십시오. 이 경우에는 이라고 정확히이라고 생각하지 않지만 Java는 쉘 특정 인용 규칙에 대해 알지 못하기 때문에 awk 명령 일 것입니다. 따라서 기본적으로 공간에 단일 문자열 입력을 토큰 화합니다 캐릭터. 그래서 awk 스크립트가 두 개로 나뉘어져 있습니다. (주석에 응답)


편집 : 첫 번째 옵션에서, 나는 당신이 파이프에 자바에서 두 프로세스 자신 사이의 출력을 수 있는지 간단하게 의미했다. 당신은 그래서 프로세스를 만든 경우

는 상상 :

Process ls = Runtime.getRuntime().exec("ls -lrt service/logs/post/level2.log"); 

지금,이 과정은 (우리가 그 파일을 설명하는 선이 될 것입니다 알고) 일부 출력을 실행하고 생성합니다. 우리는과 같이이 출력 스트림을 얻을 수 있습니다 :

InputStream lsOut = ls.getInputStream(); 

지금, 우리가 AWK 프로세스를 실행하려면 :

과정의 AWK 프로세스가 입력을 기다리는 순간이있다 앉을
Process awk = Runtime.getRuntime().exec(new String[] { "awk", "{print $9}"}); 

, 그것은 stdin에서 읽는 것을 알기 때문에.우리는 ls 명령의 출력을 읽고 AWK의 입력으로 전달 -

OutputStream awkIn = awk.getOutputStream(); 

이제, 배관 비트 :

// TODO add buffering, error handling, probably run this in a separate thread 
int datum = lsOut.read(); 
while (datum != -1) 
{ 
    awkIn.write(datum); 
    datum = lsOut.read(); 
} 
그래서, 우리는 그것을 사용하는 것하는 입력 스트림을 잡아

이것은 ls의 출력을 읽습니다 (단순화를 위해 바이트 단위로 바이트 버퍼를 사용하는 것이 훨씬 빠르지 만 간단히 개념을 설명하려고합니다). awk의 입력에 씁니다.

그렇다면 awk 프로세스의 출력을 읽고 적절하게 처리해야합니다.

+0

죄송합니다. 저는 조금 친절하게 도움을받을 수 없습니다. – user369151

+0

두 번째 프로세스 입력 스트림에 대한 첫 번째 프로세스 출력 부분을 이해해야합니다. – user369151

+0

@Andrzej Doyle : 확인하고 싶습니다. Runtime.getRuntime(). exec ("file.sh")가 실행 되든 안될까요? – Xorty

관련 문제