Скрипт 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

Как мне расширить это до трех RC? Я не смог найти правила использования этой функции. Я просто предположил, используя нижеприведенное, но это не работает во всех перестановках одного и того же теста (поочередное переименование только одного echo в 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 устанавливается в 0 или 1 в зависимости от того, list_exit > check_exit или нет. С добавлением дополнительного условия он будет установлен в большее из 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

При таком подходе вы не сможете различить коды выхода, и потенциально может возникнуть несколько кодов возврата, но для общего кода возврата «ОК»/«не ОК» этого должно быть достаточно.

решение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

Связанный контент