패턴을 찾을 수 없을 때 쉘 스크립트에서 조기 종료를 방지하기위한`set -e` 및`grep` 관용구


15

GNU / LINUX bash에서 쉘 스크립팅과 관련하여 필요한 도움말 :

나는 항상 사용 set -e합니다. 종종, 나는 싶습니다 grep항상 경우 스크립트가 실행을 종료하지 않으려는 grep종료 상태가 1발견되지 패턴을 표시합니다.

이 문제를 해결하기 위해 시도한 내용은 다음과 같습니다.

(I 시도)
하는 경우 set +o pipefail와 같은 뭔가 그렙 호출 grep 'p' | wc -l미래 메인테이너가 가능하게 될 때까지 내가 원하는 동작을 얻을 pipefail. 또한 활성화하는 pipefail것이 좋기 때문에 작동하지 않습니다.

(II를보십시오)
를 사용 sed하거나 awk만 패턴, 다음 일치하는 라인을 인쇄 wc일치하는 패턴 테스트에 일치하는 라인을. sedto를 사용 하면 grep내 진정한 문제에 대한 해결 방법처럼 보이기 때문에이 옵션이 마음에 들지 않습니다 .

(III 시도)
이것은 내가 가장 좋아하는 것입니다.set +e; grep 'p'; set-e

모든 통찰력 / 관용구가 가장 높이 평가됩니다. 감사합니다.

답변:


19

grep을 if조건에 넣거나 종료 상태에 신경 쓰지 않으면을 추가하십시오 || true.

예 : grep쉘을 죽입니다

$ bash
$ set -e
$ echo $$
33913
$ grep foo /etc/motd
$ echo $$
9233

해결 방법 1 : 0이 아닌 종료 상태를 버립니다.

$ bash
$ set -e
$ echo $$
34074
$ grep foo /etc/motd || true
$ echo $$
34074

해결 방법 2 : 종료 상태를 명시 적으로 테스트

$ if ! grep foo /etc/motd; then echo not found; fi
not found
$ echo $$
34074

bash 매뉴얼 페이지에서 다음을 논의합니다 set -e.

실패한 명령이 while 또는 until 키워드 바로 뒤에 오는 명령 목록의 일부, if 또는 elif 예약어 다음에 오는 테스트의 일부, && 또는 ││ 목록 에서 실행 된 명령의 일부인 경우 쉘이 종료되지 않습니다 . 마지막 && 또는 ││ 뒤에 오는 명령, 파이프 라인의 마지막 명령이지만 마지막 명령 또는 명령의 반환 값이 ! .


bash가 오랫동안 -e를 올바르게 구현하지 않았다면 문서가 아직 올바르지 않을 수 있습니다. 텍스트가 bash-3.x 매뉴얼 페이지와 동일한 것 같으므로 bash4.0 이전의 모든 bash 버전은 -e를 잘못 구현했습니다.
schily

POSIX 표준뿐만 아니라 잘못로 또한 참고, 우리는 2009 년에 -e와 에러 처리를위한 POSIX 텍스트를 변경 있음
schily

1
@schily -e의 '올바른'동작이 무엇인지, bash <4가 어떻게 다르게했는지, POSIX에서 변경된 사항을 알 수있는 위치를 알려주십시오.
zwol

bash-3의 버그는 기본적으로 make항상 오류로 종료되지 않기 때문에 사용할 수 없게 만듭니다 . 관련 POSIX 토론의 경우, 확인하실 수 있습니다 austingroupbugs.net
schily

@schily 좀 더 구체적으로 말씀해 주시겠습니까?
zwol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.