Ich teste verschiedene Dinge in Bash-Skripten und bin auf ein Problem gestoßen, für das ich keine Erklärung bekommen kann.
Das bin ich Schreiben Sie absichtlich einen falschen Befehl, um einen von 0 abweichenden Exit-Code zu erhalten, aber irgendwie scheint es, dass ich immer noch 0 bekomme.
Der Code, den ich ausführe, lautet:
USER_NAME=$(id -uns) if [[ ${?} -ne 0 ]] then echo "Your command failed to execute with exit code ${?}" exit 1 fi echo "Your username is ${USER_NAME}"
Die Ausgabe meines Codes lautet:
id: unbekannte Option – s
Versuchen Weitere Informationen finden Sie unter „id –help“.
Ihr Befehl konnte nicht mit dem Exit-Code 0 ausgeführt werden.
Ihr Benutzername lautet
Ich vermute, dass in irgendeiner Weise der Exit-Code für den Echo-Befehl angezeigt wird. Wenn der Exit-Code jedoch 0 ist, warum wird er in die if-Anweisung eingegeben?
Wenn dies der Fall ist, wie kann ich dann den tatsächlichen Exit-Code anzeigen, der angezeigt werden soll?
Antwort
In Ihrem Code wird in der Anweisung if
der Exit-Status angezeigt, der erhält gedruckt ist der Exit-Status des Tests [[ ${?} -ne 0 ]]
. Der Wert $?
ist immer der Exit-Status des zuletzt ausgeführten Befehls, und der Test zählt als Befehl, zumindest im Hinblick auf das Festlegen des Werts von zu seinem Ergebnis.
Wenn Sie den Exit-Status von id
drucken möchten, weisen Sie ihn einer Variablen zu, deren Wert sich nicht ändert.
id -uns err=$? if [[ $err -ne 0 ]]; then printf "id failed with code %d\n" "$err" >&2 exit 1 fi
Kommentare
- Dieses Nicht-POSIX-Skript führt …
[[
ist Teil derksh
-Syntax und wird als Teil des Interpreters ausgeführt, jedoch nicht als integrierter Befehl. Es scheint jedoch, dass dieser Teil des Interpreters den gespeicherten Exit-Code zurücksetzt. - Warum führt das Skript jedoch beide
echo
aus? Ich hätte es erwartet um nach dem ersten zu beenden und nicht zum zweiten zu gelangen. - @pericynthion Sie zeigen nicht den Code an, den sie tatsächlich ausgeführt haben. Die Ausgabe, die sie anzeigen, stammt von eine Version ihres Codes ohne die Anweisung
exit 1
. Es wurde wahrscheinlich später hinzugefügt.