Siehe die folgenden Beispiele und ihre Ausgaben in POSIX-Shells:
false;echo $?
oderfalse || echo 1
:1
false;foo="bar";echo $?
oderfoo="bar" && echo 0
:0
foo=$(false);echo $?
oderfoo=$(false) || echo 1
:1
foo=$(true);echo $?
oderfoo=$(true) && echo 0
:0
Wie in der am höchsten bewerteten Antwort unter /programming/6834487/what-is-the-variable-in-shell-scripting erwähnt :
$?
wird verwendet, um den Rückgabewert des zuletzt ausgeführten Befehls zu ermitteln.
Dies ist in diesem Fall wahrscheinlich etwas irreführend. Lassen Sie uns also die POSIX-Definition erhalten, die auch in einem Beitrag aus diesem Thread zitiert wird:
? Wird auf den dezimalen Exit-Status der letzten Pipeline erweitert (siehe Pipelines).
Es sieht also so aus, als ob eine Zuweisung selbst als Befehl (oder vielmehr als Pipeline-Teil) mit einem Exit-Wert von Null zählt, der jedoch vor der rechten Seite der Zuweisung gilt (z. B. die Befehlsersetzungsaufrufe in meinen Beispielen hier).
Ich sehe, wie dieses Verhalten aus praktischer Sicht sinnvoll ist, aber es scheint mir etwas ungewöhnlich, dass die Aufgabe selbst in dieser Reihenfolge zählt. Um klarer zu machen, warum es mir fremd ist, nehmen wir an, dass die Aufgabe eine Funktion war:
ASSIGNMENT( VARIABLE, VALUE )
dann foo="bar"
wäre es
ASSIGNMENT( "foo", "bar" )
und foo=$(false)
wäre so etwas wie
ASSIGNMENT( "foo", EXECUTE( "false" ) )
was bedeuten würde , dass die EXECUTE
Läufe zuerst und erst danach ASSIGNMENT
ausgeführt wird , aber es ist immer noch der EXECUTE
Status, der hier ankommt.
Bin ich in meiner Einschätzung richtig oder missverstehe / vermisse ich etwas? Sind das die richtigen Gründe, warum ich dieses Verhalten als "seltsam" betrachte?
false;foo="bar";echo $?
immer 0 zurückgegeben, wenn der letzte echte Befehl ausgeführt wurde false
?" Grundsätzlich verhalten sich Zuweisungen besonders, wenn es um Exit-Codes geht. Ihr Exit-Code ist immer 0, außer wenn dies nicht auf etwas zurückzuführen ist, das als Teil der rechten Seite der Zuweisung ausgeführt wurde.