"( 없이 ) 많은 명령을 실행하고 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 -e
aka를 사용하여 실행되거나 호출된 스크립트는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 ]
{ ...; }
) ((...))
과 [[ ... ]]
둘 다복합 명령.