이것은 오래된 질문이지만 데비안 패키지 처리 스크립트에서 set -e일명 사용에 대해서는 여기에 답변이 없습니다 set -o errexit. 이 스크립트에서는 데비안 정책에 따라이 옵션을 반드시 사용해야합니다 . 의도는 처리되지 않은 오류 조건의 가능성을 피하기위한 것입니다.
이것이 실제로 의미하는 것은 실행하는 명령이 오류를 반환 할 수있는 조건을 이해하고 각 오류를 명시 적으로 처리해야한다는 것입니다.
일반적인 문제는 (예 : diff차이 grep가있을 때 오류를 반환 ) 및 (일치가 없으면 오류를 반환)입니다. 명시 적 처리로 오류를 피할 수 있습니다.
diff this that ||
echo "$0: there was a difference" >&2
grep cat food ||
echo "$0: no cat in the food" >&2
(메시지에 현재 스크립트 이름을 포함시키고 표준 출력 대신 표준 오류에 진단 메시지를 쓰는 방법에주의하십시오.)
명시 적 처리가 실제로 필요하거나 유용하지 않으면 명시 적으로 아무 것도 수행하지 마십시오.
diff this that || true
grep cat food || :
(셸의 :no-op 명령 사용은 약간 애매하지만 상당히 일반적입니다.)
반복해서 말하면
something || other
속기
if something; then
: nothing
else
other
fi
즉 other, something실패 할 경우에만 실행해야한다고 명시 적으로 말하고 있습니다 . 긴 형식 if(와 같은 다른 쉘 흐름 제어 문은 while, until그것이 아니었다면),도와 쉘 스크립트 참으로 (오류를 처리 할 수있는 유효한 방법이다set -e 흐름 제어 문을 포함하지 않을 수 있습니다!)
또한 명시 적으로, 이와 같은 핸들러 set -e가 없으면 diff차이점을 grep찾거나 일치를 찾지 못하면 전체 스크립트가 즉시 오류와 함께 실패 합니다.
반면에 일부 명령은 원하는 경우 오류 종료 상태를 생성하지 않습니다. 일반적으로 문제가되는 명령은 find(종료 상태는 파일이 실제로 발견되었는지 여부를 반영하지 않음) 및 sed(종료 상태는 스크립트가 입력을 받았는지 또는 실제로 명령을 성공적으로 수행했는지 여부를 나타내지 않음)입니다. 일부 시나리오에서 간단한 가드는 출력이 없으면 소리를 지르는 명령으로 파이프하는 것입니다.
find things | grep .
sed -e 's/o/me/' stuff | grep ^
파이프 라인의 종료 상태는 해당 파이프 라인에서 마지막 명령의 종료 상태입니다. 따라서 위의 명령은 실제로 find및 의 상태를 완전히 숨기고 최종적으로 성공 sed했는지 여부 만 알려줍니다 grep.
(물론 Bash는 set -o pipefail;하지만 데비안 패키지 스크립트는 Bash 기능을 사용할 수 없습니다. 정책 sh은 이러한 스크립트 에 POSIX 를 사용하도록 강력하게 규정하고 있지만 항상 그런 것은 아닙니다.)
많은 상황에서 이것은 방어 적으로 코딩 할 때 별도로주의해야 할 사항입니다. 때로는 예를 들어 임시 파일을 통해 가야하므로 관용구와 편의가 쉘 파이프 라인을 사용하도록 지시하더라도 출력을 생성 한 명령이 성공적으로 완료되었는지 확인할 수 있습니다.