어떤 명령이 실패하면 나머지 명령이 더 이상 실행되지 않도록 하는 일련의 명령을 실행하고 싶습니다. 우리는 명령 순서가 다음과 같다고 가정합니다.
echo foo
false
echo bar
(즉, 응답을 기대 foo
하지만 응답을 기대하지 않습니다 bar
.)
set -e
이것은 내가 사용하는 스크립트에서 발생해야 합니다.아니요위의 명령 순서가 실패하면 완전한 실패가 예상됩니다. 내 초기 생각은 서브 쉘을 사용하는 것이 었습니다
( echo foo ; false ; echo bar ; ) || true
그러나 이것은 작동하지 않습니다. 둘 다 인쇄 foo
됩니다 bar
. 왜냐하면 POSIX 사양에 따르면 set -e
inside의 왼쪽이 ||
조건부 내에서와 마찬가지로 효과를 잃기 때문입니다. if
사양의 이 부분은 추상화를 깨기 때문에 개념적으로 결함이 있다고 생각합니다. , 하지만 아 글쎄요, 현재 POSIX 사양에는 변경 사항이 없습니다). set -e
괄호 안에 명시적으로 넣어도 이 문제가 해결되지 않습니다.
실패할 수 있고 스크립트가 실패할 수 있는 일부 대체 명령을 실행하고 싶기 set +e ... set -e
때문에 문제의 이 부분을 해결할 수 없습니다 . || true
(게다가 명시적 set
명령을 통해 상태를 복원하는 것은 보기 흉합니다.)
따라서 사실 이후에 set +e
명시적인 검사 만 수행 $?
하거나 일련의 명령을 별도의 스크립트(별도의 파일 또는 통해 bash <<EOF ...
)로 실행할 수 있는 것 같습니다. 이는 (배열) 변수에 쉽게 액세스할 수 없다는 단점이 있습니다.
솔직히 이것은 상당히 일상적인 사용 사례처럼 보이며 +e
조건으로 사용되는 표현식의 왼쪽에 있는 암시적 및 강제는 불균형적으로 놀라울 정도로 어려워집니다. 제가 놓친 간단한 옵션이 있나요?
답변1
첫 번째 명령이 실패할 때까지 일련의 명령을 실행하려면 다음을 수행하십시오.
$ command1 && command2 && command3 && command4
&&
토큰은 왼쪽 명령이 0 종료 코드를 반환하는 경우에만 오른쪽 명령을 실행합니다.