
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 PIPESTATUS
und 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