Betrachten Sie den folgenden Code
Outer-scope.sh
#!/bin/bash
set -e
source inner-scope.sh
echo $(inner)
echo "I thought I would've died :("
inner-scope.sh
#!/bin/bash
function inner() { echo "winner"; return 1; }
Ich versuche zu beenden outer-scope.sh
, wenn ein Anruf inner()
fehlschlägt. Da $()
eine Sub-Shell aufgerufen wird, geschieht dies nicht.
Wie kann ich die Ausgabe einer Funktion erhalten, ohne die Tatsache zu vernachlässigen, dass die Funktion mit einem Exit-Code ungleich Null beendet wird?
echo $()
, kann dies auch daran liegen, dass die Exit-Codes der Subshells ignoriert werden, wenn die Zeile - derecho
Befehl - einen eigenen Exit-Code (normalerweise 0) hat.if ! $(exit 1) ; then echo $?; fi
bekomme ich0
. Sie sind sich nicht sicherif
, ob Sie diesen Exit-Wert beibehalten müssen.if ! output=$(inner); then exit $?; fi
wird mit einem Rückgabewert von 0 beendet, da$?
der Rückgabewert von!
anstelle des Rückgabewerts von angegeben wirdinner
. Sie könnten das gewünschte Verhalten mit bekommen,if output=$(inner); then : ; else exit $?; fi
aber das ist offensichtlich ausführlicherSiehe BashFAQ / 002 :
Ein besonderer Fall
Beachten Sie bei einem schwierigen Fall mit lokalen Funktionsvariablen den folgenden Code:
Wir werden .. bekommen:
Warum?
Wenn die Ausgabe einer Subshell zum Initialisieren einer
local
Variablen verwendet wird, ist der Beendigungsstatus nicht mehr die Subshell, sondern der wahrscheinlichste Befehl .local
0
Siehe auch https://stackoverflow.com/a/4421282/537554
quelle
Durch das Hinzufügen
echo
steht die Subshell nicht alleine (wird nicht separat geprüft) und bricht nicht ab. Die Zuordnung umgeht dieses Problem.Sie können dies auch tun und die Ausgabe in eine Datei umleiten, um sie später zu verarbeiten.
quelle