BASH 스크립트: "전역 종료"를 제공하기 위해 3개의 반환 코드/종료 상태를 가져오려고 합니다.

BASH 스크립트: "전역 종료"를 제공하기 위해 3개의 반환 코드/종료 상태를 가져오려고 합니다.

어딘가에서 복사된 작동 중인 global_exit가 있고 두 명령 종료 모두에 사용됩니다. 실패를 강제하기 위해 "echo"의 이름을 "ech"로 바꾸면 모든 순열이 작동하는지 테스트할 수 있습니다. 여기에서 수행됩니다.

echo "$USER $(date +%F)" |& tee info.log
info_exit=${PIPESTATUS[0]}
echo "$USER $(date +%F)" |& tee list.log
list_exit=${PIPESTATUS[0]}

global_exit=$(( info_exit > list_exit ? info_exit : list_exit ))

if [ ${global_exit} = "0" ]; then
echo ">> SUCCESS <<"
elif [ ${global_exit} = "1" ]; then
echo ">> WARNINGS <<"
else
echo ">> FAILED <<"
fi
exit

이것을 3개의 RC로 확장하려면 어떻게 해야 합니까? 이 기능을 사용하는 방법에 대한 규칙을 찾지 못했습니다. 방금 다음을 사용하여 추측했지만 동일한 테스트의 모든 순열에 대해 작동하지 않습니다(실패를 강제하려면 하나의 에코 이름을 하나씩 ech로 바꿉니다).

echo "$USER $(date +%F)" |& tee info.log
info_exit=${PIPESTATUS[0]}
echo "$USER $(date +%F)" |& tee list.log
list_exit=${PIPESTATUS[0]}
echo "$USER $(date +%F)" |& tee check.log
check_exit=${PIPESTATUS[0]}

global_exit=$((( info_exit > list_exit > check_exit ? info_exit : list_exit > check_exit )))

if [ ${global_exit} = "0" ]; then
echo ">> SUCCESS <<"
elif [ ${global_exit} = "1" ]; then
echo ">> WARNINGS <<"
else
echo ">> FAILED <<"
fi
exit

감사해요:)

답변1

내 의도가 정확하고 작성한 코드를 계속 사용하려면 다음을 변경하십시오.

global_exit=$((( info_exit > list_exit > check_exit ? info_exit : list_exit > check_exit )))

이와 관련하여:

global_exit=$((( info_exit > list_exit > check_exit ? info_exit : list_exit > check_exit ? list_exit : check_exit )))

info_exit가 최대인 경우 아시다시피 잘 작동합니다. 그렇지 않은 경우 global_exit는 list_exit > check_exit 여부에 따라 0 또는 1로 설정됩니다. 추가적인 조건이 추가되면 list_exit와 check_exit 중 큰 값으로 설정됩니다.

답변2

0, 1 및 기타 모든 반환 코드를 함께 확인하는 한 가지 방법은 반환 코드를 결합하는 것입니다.

echo "$USER $(date +%F)" |& tee info.log
exit_code=$((exit_code | PIPESTATUS[0]))
echo "$USER $(date +%F)" |& tee list.log
exit_code=$((exit_code | PIPESTATUS[0]))
echo "$USER $(date +%F)" |& tee check.log
exit_code=$((exit_code | PIPESTATUS[0]))

if (( 0 == exit_code )); then
  echo ">> SUCCESS <<"
elif (( 1 == exit_code )); then
  echo ">> WARNING <<"
else
  echo ">> FAILED <<"
fi

이 접근 방식을 사용하면 종료 코드를 구별할 수 없으며 여러 개의 반환 코드가 발생할 수 있지만 일반적인 OK/Not OK 반환 코드의 경우 충분합니다.

답변3

기능을 사용하여 확인할 수 있습니다모두상태 코드를 선택 PIPESTATUS하고 가장 높은 값을 저장합니다.

#!/bin/bash

max_exit=0

set_max_exit() {
  for i in "${PIPESTATUS[@]}"; do
    [ "$i" -gt "$max_exit" ] && max_exit=$i
  done
}

echo | grep x   # exit 1
set_max_exit

ech             # exit 127
set_max_exit

ls adfds        # exit 2
set_max_exit

if [ "$max_exit" -eq 0 ]; then
  echo ">> SUCCESS <<"
elif [ "$max_exit" -eq 1 ]; then
  echo ">> WARNING <<" >&2
else
  echo ">> FAILED <<" >&2
fi

exit "$max_exit"

산출:

$ ./script.sh
./script.sh: line 14: ech: command not found
ls: cannot access 'adfds': No such file or directory
>> FAILED <<
$ echo $?
127

관련 정보