&& / ||의 복합 명령 상태

&& / ||의 복합 명령 상태

나는 이것이 일반적인 질문이라는 것을 알고 있으며 이전에 이에 대한 답변을 본 적도 있지만 그것이 무엇인지 기억이 나지 않으며 찾을 수도 없습니다.

#!/usr/bin/env bash

set -m         # allow for job control
EXIT_CODE=0    # exit code of overall script

function foo() {     
     for job in `jobs -p`; do
         echo "PID => ${job}"
         wait ${job} ||  { echo "At least one test failed with exit code => $?" ; EXIT_CODE=1; }
     done
}

trap 'foo' CHLD

내 문제는 다음 줄과 관련이 있습니다.

wait ${job} ||  { echo "At least one test failed with exit code => $?" ; EXIT_CODE=1; }

0이 아닌 종료 코드가 생성 되면 wait ${job}명령문을 에코한 다음 할당을 수행하고 싶습니다( 에 1 할당 EXIT_CODE).

나는 내 문법이 정확하다고 생각하지 않습니다. 명백한 오류는 발생하지 않지만 명령문이 응답을 받지 못하기 때문에 그것이 잘못된 것이라고 확신합니다. 하지만 여전히 종료 코드 1로 종료됩니다.

답변1

wait0이 아닌 종료 상태로 종료 되었습니까 ? 예를 들어 다음을 고려하십시오.

false || { echo "At least ..."; EXIT_CODE=1; }

그러면 메시지가 생성되고 EXIT_CODE적절하게 설정됩니다.

나는 처음에 이것이 당신이 찾고 있는 것이라고 생각했습니다.

wait ${job} || ( echo "At least ..."; EXIT_CODE=1 )

이 접근 방식의 문제점은 의 내용이 (...)하위 쉘에서 실행된다는 것입니다. 값에 대한 변경 사항은 EXIT_CODE해당 하위 쉘에 국한됩니다(즉, 나중에 읽으려고 할 때 표시되지 않습니다).

예를 들어 다음을 고려하십시오.

EXIT_CODE=0
false || ( echo "At least ..." ; EXIT_CODE=1; echo "code: ${EXIT_CODE}" )
echo "final code: ${EXIT_CODE}"

출력은 다음과 같습니다:

At least ...
code: 1
final code: 0

너무 화려하게 꾸미려고 하지 않는 것이 좋습니다.

if ! wait ${job}; then
    echo "At least ..."
    EXIT_CODE=1;
fi

관련 정보