Ich spielte mit trap
innerhalb einer Funktion wegen this question rum und kam mit dieser sekundären Frage. Angesichts den folgenden Code:Wohin geht der Exit-Status nach Trap/Return?
d() {
trap 'return' ERR
false
echo hi
}
Wenn ich d
laufen, die trap
bewirkt, dass der Schal aus der Funktion zurück, ohne Druck ‚hallo‘. So weit, ist es gut. Aber wenn ich es ein zweites Mal ausführen, erhalte ich eine Nachricht aus der Schale:
-bash: Rückkehr: kann nur `return‘ aus einer Funktion oder sourced Skript
Zuerst nahm ich Das bedeutete, dass das ERR-Signal zweimal vorkam: Einmal, wenn false
einen Nicht-Null-Exit-Status (innerhalb der Funktion) gab und erneut, wenn die Funktion selbst mit einem Nicht-Null-Exit-Status (außerhalb der Funktion) zurückkehrte. Aber diese Hypothese nicht halten gegen diesen Test up:
e() {
trap 'echo +;return' ERR
false
echo hi
}
Wenn ich laufen die oben, egal wie oft ich es laufen, ich nicht mehr bekommen die kann nur return
aus einer Funktion oder sourced Skript Warnung von bash. Warum behandelt die Shell einen zusammengesetzten Befehl, der sich von einem einfachen Befehl in einem trap
arg unterscheidet?
Mein Ziel war es, den tatsächlichen Exit-Status des Befehls zu erhalten, dass die Funktion verursacht zu verlassen, aber ich denke, was das obige Verhalten verursacht macht auch den Exit-Status Erfassung kompliziert:
f() {
trap '
local s=$?
echo $s
return $s' ERR
false
echo hi
}
bash> f; echo $?
1
0
Wat? Kann jemand bitte erklären, warum sich hier auf zwei verschiedene Werte ausdehnt und, wenn es sich herausstellt, dass es die gleiche Ursache ist, die obige Unterscheidung zwischen return
und echo +; return
?
Es gibt einige überraschende Umfangsprobleme hier. Ihre Traps sind nicht funktionsspezifisch, sondern global. Beachten Sie, dass, wenn Sie Ihre e() - Funktion erstellen und dann einen ungültigen Befehl eingeben, z. B. "ggg", Ihre Trap trifft und Sie die Fehlermeldung erhalten. Tracing mit -vx zeigt auch, dass Sie in Ihrem ersten Beispiel zweimal "zurückkehren", nachdem es einmal ausgeführt wurde. –
Das Übergeben des Exit-Status des 'trap'ped-Befehls kann schwierig sein, wie' man bash' feststellt: "Der Rückgabestatus [von Trap] ist falsch, wenn irgendein Sigspec ungültig ist; andernfalls gibt trap true zurück." –