1:

1:

나는 시스템에 문제가 있는지 확인하기 위해 일련의 스크립트를 실행하는 C++ 감시 장치를 작성했습니다.

코드가 약간 까다로워서 여기에 표시하지는 않지만 다음과 같은 시스템 호출에 해당합니다.

int const r(system("/bin/sh /path/to/script/test-health"));

r명령문에 명령이 누락 되어 스크립트가 실패한 경우 에만 if0입니다 . 스크립트에 공격적인 부분이 있습니다.

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 목록을 제외한 모든 명령을 실행할 때 이 설정은 무시되어야 합니다.whileuntilifelif!

이는 if명령문 내에서 알 수 없는 명령을 실행하면아니요실행 중에 스크립트가 종료됩니다 set -e. 아니면 오히려 set -e종료를 초래하지 않습니다.


사용자는 호출되는 유틸리티의 전체 경로를 사용하지 않는 한 command -v현재 유틸리티가 존재하는지 여부를 테스트합니다 PATH. 이 경우 -x질문에서 알 수 있듯이 테스트로 충분합니다.

또한보십시오: " which "를 사용하지 않는 이유는 무엇입니까? 그러면 무엇을 사용해야 합니까?

답변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번출구
필리핀 제도

관련 정보