명령을 고려하십시오
eval false || echo ok
echo also ok
일반적으로, 우리는 이것이 실행 기대 false유틸리티를하고, 종료 상태가 제로가 아닌 있기 때문에, 다음 실행 echo ok하고 echo also ok.
모두에서 POSIX 같은 내가 사용하는 쉘 ( ksh93, zsh, bash, dash, 오픈 BSD ksh, 그리고 yash)이 무슨 일이지만, 일이 우리가 사용하도록 설정하는 경우 흥미있어 set -e.
set -e유효 하다면 , OpenBSD sh와 ksh쉘 (모두에서 파생 된 pdksh)은를 실행할 때 스크립트를 종료합니다 eval. 다른 쉘은 그렇게하지 않습니다.
POSIX에 따르면 특수 내장 유틸리티 (예 :) 의 오류로 eval인해 비 대화식 쉘이 종료 될 수 있습니다. 실행이 false"오류"를 구성 하는지 여부는 확실하지 않습니다 (있는 경우 set -e활성 상태와 무관 ).
이 문제를 해결하는 방법 eval은 하위 쉘에 넣는 것 같습니다 .
( eval false ) || echo ok
echo also ok
문제는 POSIX가 올바른 쉘 스크립트에서 그렇게해야하는지 아니면 OpenBSD의 쉘에서 버그인지 여부입니다. 또한 위의 POSIX 텍스트에서 "오류"는 무엇을 의미합니까?
추가 정보 : OpenBSD 셸은 명령이 있거나 echo ok없는 set -e 명령을 모두 실행합니다
eval ! true || echo ok
내 원래 코드는 다음과 같습니다
set -e
if eval "$string"; then
echo ok
else
echo not ok
fi
있는 것 없는 출력 not ok과 string=false(가 종료 것) 오픈 BSD 쉘을 사용하고 나는 확실히 그것을 실수로 또는 오해, 또는 다른 무언가에 의해, 디자인되었다 아니었다.
eval falseAND-OR 목록 또는 조건 문의 일부인 경우에도 스크립트를 종료 하시겠습니까 ? 나는하지 않을 것입니다.
set -e올바른 행동인지 설정되어 있는지 확실하지 않습니다 ... 조건문으로 끝나지 않는 것이 합리적입니다.
set -e이므로`()`이 답입니다.
eval false0이 아닌 상태를 생성하므로set -e해당 시점에서 스크립트를 종료 할 것으로 예상 됩니다.!set -eapply as not!statement 의 경우 종료 상태를 명시 적으로 확인합니다.