if 문에서 명령 종료 코드를 확인하는 방법

if 문에서 명령 종료 코드를 확인하는 방법

명령이 코드 143("Timeout Command"의 시간 초과)으로 종료되면 0 종료 코드를 반환하려고 시도하고 그렇지 않으면 1을 반환하려고 합니다. 외부 제약(CI 스크립트)으로 인해 명령을 시작하고 if 절에서 확인해야 합니다.

이것이 내가 현재 사용하는 것입니다:

if timeout -t 10 *command* || [ $? = 143 ]
then exit 0
else exit 1
fi

현재는 항상 코드 0으로 종료됩니다.

답변1

종료 상태가 0(셸 스크립트에서 true로 처리되는 종료 상태)이면 명령이 종료 상태 0으로 완료되고 올바른 결과가 나오지 않기 때문에 스크립트가 원하는 작업을 수행하지 않습니다. 실행 중 손 쪽. 마찬가지로, 로 바꾸면timeout -t 10 commandtimeout -t 10 command || [ $? = 143 ]||||&&0이 아닌왼쪽의 종료 상태는 전체 명령의 종료 상태이고 오른쪽은 실행되지 않습니다.

두 개의 별도 명령으로 실행해야 합니다.또는 줄바꿈 으로 구분하세요 ;. 필요한 경우 이 작업을 수행할 때 조건으로 사용할 수 있습니다 if(아래 참조).

대신 종료 상태라고 가정합니다.timeout -t 10 commandcommand(다른 경우) 필요합니다. 그렇지 않으면 당신이 원하는 것이 무엇인지 모르겠습니다.이르카츄처럼timeout, 옵션을 허용 하는 명령 에 익숙하지 않습니다 -t. 일반적으로 이 작업을 수행하는 것이 좋습니다. 단, "외부 제약 조건"이 if전혀 사용되지 않기 때문에 금지할 수 있는 것처럼 들립니다.

timeout -t 10 command
test "$?" -eq 143
exit

test/ 명령은 true인 경우 종료 코드 0, false인 경우 1을 반환하므로 별도의 분기를 [사용하고 작성할 필요가 없습니다 . 인수 없이 실행하면 내장 명령으로 인해 쉘이 마지막 명령 실행의 종료 상태를 반환합니다.exit 0exit 1exit

exit제어 흐름이 스크립트 끝을 벗어나면 다음과 같은 효과가 있으므로 이미 스크립트 끝에 있는 경우 이를 생략할 수 있습니다 exit.

timeout -t 10 command
test "$?" -eq 143

(두 경우 모두 [ "$?" -eq 143 ]원하는 경우 쓰기 대신 쓸 수 있습니다. /usage에 대한 자세한 내용은 아래를 참조하세요.)test "$?" -eq 143[test

설명이 코드를 완전히 사용할 수 없는 것처럼 들리더라도 원하는 형식을 취하도록 코드를 수정할 수는 있습니다.당신은 단지 할 수 없다고 말합니다조사하다뿐만 아니라시작 명령if조건 에서 .이건 금지인거 같은데Hauke ​​Laging이 제안한 읽기 쉽고 관용적인 접근 방식명령 실행앞으로이것 if.

따라서 그렇게 할 수 없다면 if조건에 명령을 포함할 수 있습니다. 단, a 대신 a를 사용하여 test/ [명령과 구분하세요.;||

if timeout -t 10 command; [ "$?" -eq 143 ]; then
    exit 0
else
    exit 1
fi

" "( 주위 를 생략할 수 있습니다 . 대신 을 $?쓸 수도 있지만 숫자 비교가 아닌 텍스트 비교를 나타내기 때문에 혼란스럽습니다 . 원하는 경우 대신 을 쓸 수 있습니다 .)=143=test "$?" -eq 143[ "$?" -eq 143 ]

그 이유는 if세미콜론이나 개행 문자로 구분된 여러 명령으로 구성된 조건을 작성할 수 있기 때문입니다. 이것이 쉘 구문에서 then조건의 끝을 나타내기 위해 작성해야 하는 이유입니다 if. 따라서 두 명령을 조건으로 실행하고 두 번째 명령만 테스트하도록 하는 것이 목표인 경우 &&or 연산자를 우회적으로 사용하려고 할 필요가 없습니다 .||ifif

내가 이것을 제안하는 이유는 모든 것이 이 if상태여야 한다고 말씀하셨기 때문입니다. 필요하지 않은 경우에는 이와 같은 스크립트를 작성하지 않는 것이 좋습니다.

답변2

timeout -t 10 command
if [ $? -eq 143 ]; then
    exit 0
else
    exit 1
fi

관련 정보