나는 이것이 일반적인 질문이라는 것을 알고 있으며 이전에 이에 대한 답변을 본 적도 있지만 그것이 무엇인지 기억이 나지 않으며 찾을 수도 없습니다.
#!/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
wait
0이 아닌 종료 상태로 종료 되었습니까 ? 예를 들어 다음을 고려하십시오.
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