BASH-Skript: Versuch, 3 Rückgabecodes/Beendigungsstatus zu erhalten, um einen „globalen Ausgang“ zu ermöglichen

BASH-Skript: Versuch, 3 Rückgabecodes/Beendigungsstatus zu erhalten, um einen „globalen Ausgang“ zu ermöglichen

Ich habe irgendwo ein funktionierendes global_exit kopiert, es ist für zwei Befehlsausgänge. Durch die Umbenennung von „echo“ in „ech“, um einen Fehler zu erzwingen, kann ich testen, ob alle Permutationen funktionieren – und das tun sie hier:

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

Wie kann ich das auf drei RCs erweitern? Ich konnte die Regeln zur Verwendung dieser Funktion nicht finden. Ich habe einfach Folgendes geraten, aber es funktioniert nicht bei allen Permutationen desselben Tests (nacheinander nur ein Echo in Ech umbenennen, um einen Fehler zu erzwingen):

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

Danke :)

Antwort1

Wenn ich die Absicht richtig verstanden habe und Sie mit dem Code wie geschrieben fortfahren möchten, ändern Sie Folgendes:

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

dazu:

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

Wenn info_exit am größten ist, funktioniert es einwandfrei. Wenn nicht, wird global_exit auf 0 oder 1 gesetzt, je nachdem, ob list_exit > check_exit ist oder nicht. Mit der hinzugefügten zusätzlichen Bedingung wird es auf den größeren Wert von list_exit oder check_exit gesetzt.

Antwort2

Eine Möglichkeit, mehrere Rückgabecodes gemeinsam auf 0, 1 und den Rest zu prüfen, besteht darin, die Rückgabecodes zu kombinieren:

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

Bei diesem Ansatz können Sie nicht zwischen den Exit-Codes unterscheiden und möglicherweise können mehrere Rückgabecodes auftreten, aber für einen allgemeinen OK/Nicht-OK-Rückgabecode sollte dies ausreichen.

Antwort3

Sie könnten eine Funktion verwenden und prüfenalleStatuscodes von PIPESTATUSund speichern Sie den höchsten Wert.

#!/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"

Ausgabe:

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

verwandte Informationen