명령을 고려하다
eval false || echo ok
echo also ok
일반적으로 유틸리티를 실행 false
하고 종료 상태가 0이 아니므로 echo ok
및 를 실행합니다 echo also ok
.
이것은 내가 사용하는 모든 POSIX 유사 쉘( ksh93
, zsh
, bash
OpenBSD 및 ) 에서 발생 하지만 이를 활성화하면 상황이 흥미로워집니다 .dash
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 텍스트에서 "오류"는 무엇을 의미합니까?
echo ok
추가 정보: OpenBSD 쉘은 명령을 사용하거나 사용하지 않고 실행됩니다.set -e
eval ! true || echo ok
내 원래 코드는 다음과 같습니다
set -e
if eval "$string"; then
echo ok
else
echo not ok
fi
이것은 것이다아니요not ok
OpenBSD 셸의 출력 string=false
(종료됨)을 사용하면 이것이 의도적인 것인지, 버그나 오해인지, 아니면 다른 것인지 확실하지 않습니다.
답변1
다른 셸에는 이러한 해결 방법이 필요하지 않습니다. 이는 이것이 OpenBSD ksh의 버그임을 강력히 시사합니다. 실제로 ksh93에는 그런 문제가 없습니다.
||
쉘이 종료되도록 하는 반환 코드가 왼쪽에 1이 되도록 피해야 하는 명령줄이 있습니다 .
오류는 다음과 같습니다특별한내장으로 인해 비대화형 쉘이 종료됩니다.POSIX에 따르면그러나 항상 그런 것은 아닙니다. continue
루프에서 벗어나려고 시도하는 것은 오류이며 continue
내장되어 있습니다. 그러나 다음과 같은 상황에서는 대부분의 쉘이 종료되지 않습니다.
continue 3
명백한 오류를 발생시키지만 종료되지 않는 내장 함수입니다.
따라서 종료는 명령의 기본 제공 기능( 이 경우) 이 아닌 조건에 의해 생성 false
됩니다 .set -e
eval
POSIX에서는 정확한 종료 조건이 set -e
다소 모호합니다.
답변2
[실제 답변이 아닌 경우 죄송합니다. 시간이 나면 업데이트하겠습니다.]
소스코드를 살펴봤고 결론은 이렇습니다.
1) 이는 버그/제한사항이며 그 뒤에는 철학적인 의미가 없습니다.
2) OpenBSD ksh( )의 휴대용 분기에서 이에 대한 "수정"은 다음 mksh
과 같습니다.매우이런, 실제로 문제를 해결하지 않으면 상황이 더 악화될 뿐입니다.
다른 모든 쉘과 다른 새로운 오류:
mksh -ec 'eval "false; echo yup"'
yup
bash -ec 'eval "false; echo yup"'
(nothing)
아직 해결되지 않았습니다.
mksh -ec 'eval "set -e; false" || echo yup'
(nothing)
bash -ec 'eval "set -e; false" || echo yup'
yup
위의 내용을 , , 등 bash
으로 바꿀 수 있습니다 .dash
zsh
yash
ksh93