명령을 고려하십시오
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 false
AND-OR 목록 또는 조건 문의 일부인 경우에도 스크립트를 종료 하시겠습니까 ? 나는하지 않을 것입니다.
set -e
올바른 행동인지 설정되어 있는지 확실하지 않습니다 ... 조건문으로 끝나지 않는 것이 합리적입니다.
set -e
이므로`()`이 답입니다.
eval false
0이 아닌 상태를 생성하므로set -e
해당 시점에서 스크립트를 종료 할 것으로 예상 됩니다.!
set -e
apply as not!
statement 의 경우 종료 상태를 명시 적으로 확인합니다.