2011-02-11 4 views
2

"mvn"을 래퍼 (wrapper)로 구현하여 구문 강조 표시를 위해 sed를 통해 장기 실행 빌드 프로세스의 출력을 파이프합니다.sed를 통해 파이핑 출력하지만 종료 상태 유지

저는 빌드가 끝났을 때 바탕 화면에 알려주는 "모니터"스크립트가 있습니다. 모니터 스크립트는 인수의 종료 상태를 점검하고 "성공"또는 "실패"를보고합니다.

maven 출력을 sed를 통해 파이핑하면 빌드가 실패하더라도 종료 상태가 항상 "ok"입니다.

sed를 통해 올바른 종료 상태를 파이프하는 방법은 무엇입니까?

다른 방법이 있습니까?

답변

0

일주일 나중에 내가 해결책을 얻었다.

monitor "mvn blah" | sed -e SomeHiglightRegEx 

주의 할 쉽게 그이 파이프를 통해 모니터의 출력 모니터 스크립트가 MVN의 상태에 반응하면서, 나오지도.

어쨌든 다른 아이디어를 주셔서 감사합니다.

0

Bastil, 파이프가 종료 상태를 신경 쓰지 않기 때문에 sed가 정상적으로 종료되는지 여부 만 알 수 있습니다. 나는 의사처럼, 뭔가를 나오지도 스크립트를 향상 (혹은 3 라이너 펄 스크립트 사용을 고려) 예상되는 텍스트가 발견되지 않는 경우 실패 상태로 종료를 것 :

read($stdin) 
if blank 
    exit(1) // output was blank, or on $stderr 
else 
    regular expression substitution here 
end 
// natural exit success here 

당신은 그것을 할 수 있었다 perl one-liner와 같은 것은 sedscript로 할 수있다. (아는 한 sed one-liner는 아니다.)

+0

하지만 전체 출력이 생성되고 스트림 된 "sed"형식이 아닌 경우에만 정규 표현식을 수행 할 것입니다. 맞습니까? 내 PERL 지식은 꽤 비난입니다 ... – Bastl

+0

전체적으로 가능하면 잠시 () 루프를 읽을 수 있습니다. 줄을 읽는 동안 줄을 읽는 동안 줄을 바꾸면됩니다. 그것이 합리적으로 들리면, 나는 당신이 무언가를 쓸 수 있도록 도울 수있다. (그것이 5 라이너보다 적을 것을 기대한다!) –

2

아마도 PIPESTATUS 변수가 도움이 될 수있다.

+0

이것이 내가 한 방법이다 :'bash -e 'mvn blah | sed -e SomeHighlightRegEx; $ {PIPESTATUS [0]} '을 종료하십시오. –

1

이것은 후면에 잘 알려진 통증입니다. bash (그리고 다른 많은 현대의 sh 변종들)을 사용한다면, PIPESTATUS 배열에 접근하여 파이프의 앞부분에있는 프로그램의 반환 값을 얻을 수 있습니다. 일반적으로 파이프의 반환 값은 파이프에서 마지막 프로그램의 반환 값입니다. PIPESTATUS가없는 쉘을 사용하는 경우 (또는 이식성을 원할 경우)

과 같은 작업을 수행 할 수 있습니다
 
#!/bin/sh 

# run 'echo foo | false | sed s/f/t/', recording the status 
# of false in RV 
eval $({ { echo foo | false; printf RV=$? >&4; } | 
    sed s/f/t/ >&3; } 4>&1;) 3>&1 
echo RV=$RV 

# run 'echo foo | cat | sed s/f/t/', recording the status 
# of cat in RV 
eval $({ { echo foo | cat; printf RV=$? >&4; } | 
    sed s/f/t/ >&3; } 4>&1;) 3>&1 
echo RV=$RV 


각각의 경우 RV는 각각 false와 cat의 반환 값을 포함합니다.

0

아마도 당신은 명명 된 파이프를 사용할 수 있을까? 다음 예는 다음과 같습니다

원래 내가 모니터 (대신 MVN의) 나오지도의 종료 상태에 반응 할 경우

monitor "mvn blah | sed -e SomeHighlightRegEx" 

을 할 wwanted :

FIFODIR=`mktemp -d` 
FIFO=$FIFODIR/fifo 
mkfifo $FIFO 

cat $FIFO &    # An arbitrary pipeline 
if false > $FIFO 
then 
    echo "Build succeeded" 
else 
    echo "Build failed" # This line WILL execute 
fi 

rm -r $FIFODIR