명령 블록과 함께 set -e(errexit)를 사용하고 블록이 실패하면 다른 명령을 실행합니다(SC2181).

명령 블록과 함께 set -e(errexit)를 사용하고 블록이 실패하면 다른 명령을 실행합니다(SC2181).

"( 없이 ) 많은 명령을 실행하고 0이 아닌 종료 코드로 명령 중 하나를 즉시 중지하는 set -e방법"에 대한 답변을 찾고 있었기 때문에 방금 알게 되었습니다 . 내가 발견하기 전까지는 &&이것 set -e만으로도 충분했습니다.

(set -e; false; echo here) || echo error

here그러나 error나는 새로운 문제에 대한 해결책을 빨리 찾았습니다 .

(set -e; false; echo here); [ $? -ne 0 ] && echo error

$?대신에 오래된 문제에 직면하기도 했습니다 if cmd(SC2181).

이제 새로운 질문이 생겼습니다. SC2181 오류를 그냥 무시해야 합니까, 아니면 작동하게 하는 적절한 방법이 있습니까?

저도 생각해봤는데 어떤 신호가 나올지 trap모르겠네요 set -e.


알아채다

if ! (set -e; false; echo here); then
  echo error
fi

또한 .from here대신 인쇄합니다.error주택 검사웹사이트:

중복성 외에도 이 패턴을 피해야 하는 다른 이유가 있습니다.

  • [...]
  • set -eaka를 사용하여 실행되거나 호출된 스크립트는 errexit실패를 처리하는 절이 뒤에 있더라도 명령이 실패하면 즉시 종료됩니다.

이는 if명령문이 영향을 받지 않거나 errexit비활성화됨을 의미합니다.

또한 누락되거나 ()대체되면 {}오류 검사 명령을 포함하여 다음 명령의 실행이 중지됩니다.


PS 저는 제 스크립트에서 ShellCheck 오류를 최소화하려고 노력하고 싶습니다. 이는 거의 항상 스크립트가 최적화되지 않았거나 버그가 있음을 나타냅니다. 또한 추가 연산자를 사용하여 많은 수의 명령 &&IMHO를 실행하면 코드를 읽고 편집하기가 어려워지므로 (적어도 해당 특정 명령 블록에 대해서는) 더 깔끔한 솔루션을 찾고 싶습니다 ().

답변1

언제든지 다음과 같은 부정 행위를 할 수 있습니다.

last_block_failed() { return "$(( ! $? ))"; }
(set -o errexit
...
)
if last_block_failed; then
  echo>&2 error
fi

또는 유사한 변형:

last_block_failed() (( ! $? ))
last_block_failed() { [ "$?" -ne 0 ]; }
last_block_failed() [[ $? -ne 0 ]]

Bash(Bourne 쉘 및 모든 명령을 허용하는 대부분의 다른 Bourne 유사 쉘과 달리)에서 함수 본문은 다음과 같아야 합니다.화합물명령이므로 last_block_failed() [ "$?" -ne 0 ]작동하지 않습니다. 명령 그룹( { ...; }) ((...))[[ ... ]]둘 다복합 명령.

관련 정보