2017-01-07 2 views
-1

문자열에 grep을 입력하고 일치하는 항목이 있으면 필드를 잘라냅니다. 문제는 일치 여부에 상관없이 $? 명령의 결과가 0 인 것입니다. 아래의 출력을 참조하십시오파이프 라인에서 명령 상태 확인

$ R=`grep g09 tor1.sh | cut -d ' ' -f2` 
$ echo $R 
test 
$ R=`grep g09 tor1.sh | cut -d ' ' -f2` 
$ echo $? 
0 

당신이 볼 수 있듯이을, 거기에 일치하지만 $? 0 지금이 볼 수 있습니다 :

여기
$ R=`grep g09 tor.sh | cut -d ' ' -f2` 
$ echo $R 

$ R=`grep g09 tor.sh | cut -d ' ' -f2` 
$ echo $? 
0 

,이 G09에 대한 일치가 없지만 $?은 여전히를 왜?

답변

5

$?은 전체 또는 최종 종료 상태입니다. 살펴볼 필요가있는 것은 다음과 같은 bash 배열입니다.

이렇게하면 개별적인 파이프 명령의 상태를 알 수 있습니다. 그래서 경우에 대한

는 :

read str < <(grep g09 tor.sh | cut -d ' ' -f2`) 

echo ${PIPESTATUS[0]} 
1 

여기 1는 파이프 라인의 첫 번째 grep 명령의 실패를 의미한다.

추신 : 현재 쉘에서 PIPESTATUS을 올바르게 설정하려면 명령 대체 대신 프로세스 대체를 사용하고 있습니다.

예 : grep 아무것도 찾을 실패 할 때 첫 번째 예에서

read str < <(grep 'bar' <<< 'foo bar baz' | cut -d ' ' -f2) 
echo ${PIPESTATUS[0]} 
0 

read str < <(grep 'cat' <<< 'foo bar baz' | cut -d ' ' -f2) 
echo ${PIPESTATUS[0]} 
1 

grep 실행이 성공적으로 따라서 우리는 ${PIPESTATUS[0]} 2 예에서 1 0으로 만 얻을.

+1

후속 질문에서 @bishop이 지적한 것처럼, 위의'$ {PIPESTATUS [0]}'은 파이프 라인이 서브 쉘에서 실행되기 때문에 올바른 결과를 얻을 수 없습니다. 거기에 사용되는 서브 쉘이 없기 때문에 예제가 괜찮습니다. – codeforester

+1

아주 좋은 포인트 @codeforester. '$ {PIPESTATUS [0]} '을 올바르게 처리 할 수 ​​있도록 프로세스 대체를 사용하도록 응답을 수정했습니다. – anubhava

관련 문제