나는 시스템에 문제가 있는지 확인하기 위해 일련의 스크립트를 실행하는 C++ 감시 장치를 작성했습니다.
코드가 약간 까다로워서 여기에 표시하지는 않지만 다음과 같은 시스템 호출에 해당합니다.
int const r(system("/bin/sh /path/to/script/test-health"));
r
명령문에 명령이 누락 되어 스크립트가 실패한 경우 에만 if
0입니다 . 스크립트에 공격적인 부분이 있습니다.
set -e
[...]
if unknown_command arg1 arg2
then
[...]
분명히 unknown_command
실패한 이유는...알 수 없음. 그 시점에서 내가 시작했기 때문에 스크립트는 끝났습니다 set -e
.
하지만 이 경우 종료 코드는 0이 됩니다.
이 경우 종료 코드 1을 얻을 수 있는 방법이 있나요?
즉, 문제는 버그가 존재하는지 확인하기 위해 테스트를 추가하지 않고도 버그를 감지하는 것입니다 unknown_command
. 나는 이 작업을 수행하는 방법을 알고 있습니다.
if ! test -x unknown_command
then
exit 1
fi
내 요점은 스크립트를 작성할 때 unknown_command
직접 설치할 때 스크립트가 있을 것으로 예상했지만 문제가 발생하거나 누군가가 모든 것을 설치하지 않고 다른 시스템에 스크립트를 복사한 경우 스크립트를 실행할 때 무엇이 잘못되었는지 알고 싶다는 것입니다. .
답변1
POSIX 표준에서,~에 대한set -e
:
-e
, 또는 예약어 뒤의 복합 목록, 예약어로 시작하는 파이프 또는 마지막 AND-OR 목록을 제외한 모든 명령을 실행할 때 이 설정은 무시되어야 합니다.while
until
if
elif
!
이는 if
명령문 내에서 알 수 없는 명령을 실행하면아니요실행 중에 스크립트가 종료됩니다 set -e
. 아니면 오히려 set -e
종료를 초래하지 않습니다.
사용자는 호출되는 유틸리티의 전체 경로를 사용하지 않는 한 command -v
현재 유틸리티가 존재하는지 여부를 테스트합니다 PATH
. 이 경우 -x
질문에서 알 수 있듯이 테스트로 충분합니다.
답변2
그 시점에서 내가 시작했기 때문에 스크립트는 끝났습니다
set -e
.
이것은 거짓말입니다.
일반적으로 사용되는 스크립트:
$ 고양이./위블 세트이 흔들리면 메아리도 흔들립니다. ;그렇지 않으면 에코가 흔들리지 않습니다. ;페이 에코는 삭제되지 않습니다. 유형 스윙||실행 오류 실행하다 $
알려지지 않은 명령을 테스트하는 방법을 알고 있다고 말씀하셨습니다.
Almquist 쉘은 다음과 같습니다 /bin/sh
.
$ /bin/sh ./weeble ;에코$? ./weeble:weeble: 찾을 수 없음 흔들림이 없습니다. 넘어지지 않습니다. 스윙: 찾을 수 없음 1 $ /bin/sh -e ./weeble 에코 $? ./weeble:weeble: 찾을 수 없음 흔들림이 없습니다. 넘어지지 않습니다. 스윙: 찾을 수 없음 1 $
코헨 쉘은 다음과 /bin/sh
같습니다
$ /bin/sh ./weeble ;에코$? ./weeble[2]:weeble: 찾을 수 없음 흔들림이 없습니다. 넘어지지 않습니다. 스윙을 찾을 수 없습니다 1 $ /bin/sh -e ./weeble 에코 $? ./weeble[2]:weeble: 찾을 수 없음 흔들림이 없습니다. 넘어지지 않습니다. 스윙을 찾을 수 없습니다 1 $
Bourne Again 쉘은 다음과 같습니다 /bin/sh
.
$ /bin/exec -a /bin/sh /usr/local/bin/bash ./weeble echo $? ./weeble: 라인 2: wobble: 명령을 찾을 수 없습니다. 흔들림이 없습니다. 넘어지지 않습니다. ./weeble: 4행: 유형: 스윙: 찾을 수 없음 1 $ /bin/exec -a /bin/sh /usr/local/bin/bash -e ./weeble echo $? ./weeble: 라인 2: wobble: 명령을 찾을 수 없습니다. 흔들림이 없습니다. 넘어지지 않습니다. ./weeble: 4행: 유형: 스윙: 찾을 수 없음 1 $
Z 쉘은 다음과 같습니다 /bin/sh
.
$ /bin/exec -a /bin/sh /usr/local/bin/zsh ./weeble echo $? ./weeble:2: 명령을 찾을 수 없습니다:weeble 흔들림이 없습니다. 넘어지지 않습니다. 스윙을 찾을 수 없습니다 1 $ /bin/exec -a /bin/sh /usr/local/bin/zsh -e ./weeble echo $? ./weeble:2: 명령을 찾을 수 없습니다:weeble 흔들림이 없습니다. 넘어지지 않습니다. 스윙을 찾을 수 없습니다 1 $
귀하의 질문은 일어나지 않았을 일을 어떻게 피할 수 있는지에 대한 질문이고 전제와 제목이 거짓말이므로 답변할 수 없습니다.
답변3
다음과 같이 설정되었기 if
때문에 종료 되지 않습니다 .set -e
#!/bin/sh
set -e
if unknown_command; then
echo "On true, exit code $?"
else
echo "on false, exit code $?"
fi
echo "after if, exit code $?"
인쇄합니다(테스트된 모든 쉘에서 다른 오류 메시지 포함):
sh : … : unknown_command: not found
on false, exit code 127
after if, exit code 0
설정 하거나 set -e
설정 해제할 수 있습니다.
누락된 명령을 검색하려면 종료 코드 127 1 을 캡처하세요 .
#!/bin/sh
if unknown_command; then
echo "On true, exit code $?"
else
ec=$?
if [ "$ec" = '127' ]; then
echo "the command failed because it does not exist"
exit 127
fi
echo "on false, exit code $ec"
fi
echo "after if, exit code $?"
다음과 같이 실행됩니다:
$ ./script
./script: 5: ./script: unknown_command: not found
the command failed because it does not exist
1소개종료 코드 127
답변4
다음 두 가지 중 하나를 수행해야 합니다.
1:
알 수 없는 명령 arg1 arg2 후속 명령
실패하면 set -e
스크립트가 종료됩니다 unknown_command
. 왜 그런 말을 했나요 if
?
2:
arg1 arg2 명령을 알 수 없는 경우 그 다음에 후속 명령 ︙ 기타 오류 메시지 발행 필요한 정리를 수행합니다. 1번출구 필리핀 제도