저는 release.sh와 caller.sh(caller.sh가 release.sh를 호출함) 스크립트를 실행하고 있습니다. 둘 다 배쉬입니다.
release.sh에는 오류를 나타내는 "exit 1"과 함께 여러 조건이 포함되어 있습니다.
caller.sh에는 "./release.sh" 줄이 포함되어 있고 release.sh의 종료 코드를 확인합니다. $?가 0보다 크면 echo "release.sh messed up"하고 종료됩니다.
./release.sh
if [ $? -gt "0" ] ; then
echo "release_manager exited with errors, please see the release log."
exit 1
else
echo "release manager is done."
fi
최근에 release.sh를 문서화하기로 결정했기 때문에 caller.sh의 줄은 다음과 같습니다.
./release.sh 2>&1 | tee release.txt
파이프 때문에 $? 은 'tee release.txt'의 종료 코드이며 이전 명령에 관계없이 항상 0을 표시합니다. :-(
release.sh 오류를 확인하고 호출자가 계속 진행되지 않도록 해야 하지만 해당 로그도 필요합니다.
명령의 종료 코드를 얻는 방법이 있습니까?앞으로마지막? 아니면 동일한 명령으로 게시 스크립트를 다른 방식으로 기록하시겠습니까?
나는 release.sh에 대한 책임이 없으며 이를 변경하고 싶지 않습니다.
답변1
Bash를 사용하고 있으므로 스크립트에서 옵션을 설정할 수 있습니다.
set -o pipefail
파이프의 반환 상태는 0이 아닌 상태로 종료된 마지막(가장 오른쪽) 명령의 값이거나 모든 명령이 성공적으로 종료된 경우 0입니다.
또는 파이프라인 명령 직후에 ${PIPESTATUS[0]}
파이프라인의 첫 번째 명령 종료 코드에 대한 기본 제공 변수 값을 볼 수 있습니다.
PIPESTATUS: 포그라운드 파이프라인에서 가장 최근에 실행된 프로세스에 대한 종료 상태 값 목록을 포함하는 배열 변수입니다(단일 명령만 포함할 수 있음).
답변2
다음과 같이 다시 작성하는 것이 좋습니다.
./release.sh > release.txt 2>&1
그런 다음
echo $?
올바른 종료 상태를 반환합니다