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 der ksh -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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.