Beachten Sie, dass dies in Kombination mit local
nicht der Fall ist , wie in local variable="$(command)"
. Dieses Formular wird erfolgreich beendet, selbst wenn command
fehlgeschlagen.
Nehmen Sie zum Beispiel dieses Bash-Skript:
#!/bin/bash
function funWithLocalAndAssignmentTogether() {
local output="$(echo "Doing some stuff.";exit 1)"
local exitCode=$?
echo "output: $output"
echo "exitCode: $exitCode"
}
function funWithLocalAndAssignmentSeparate() {
local output
output="$(echo "Doing some stuff.";exit 1)"
local exitCode=$?
echo "output: $output"
echo "exitCode: $exitCode"
}
funWithLocalAndAssignmentTogether
funWithLocalAndAssignmentSeparate
Hier ist die Ausgabe davon:
[email protected]:~$ ./tmp.sh
output: Doing some stuff.
exitCode: 0
output: Doing some stuff.
exitCode: 1
Das liegt daran, dass local
ist eigentlich ein eingebauter Befehl und ein Befehl wie local variable="$(command)"
ruft local
auf nach Ersetzen der Ausgabe von command
. Sie erhalten also den Exit-Status von local
.
Beim Ausführen eines Befehls als $(command)
erlaubt der Ausgabe des Befehls, sich selbst zu ersetzen.
Wenn Sie sagen:
a=$(false) # false fails; the output of false is stored in the variable a
die vom Befehl false
erzeugte Ausgabe wird in der Variable a
gespeichert . Darüber hinaus ist der Exit-Code derselbe wie der vom Befehl erzeugte. help false
würde sagen:
false: false
Return an unsuccessful result.
Exit Status:
Always fails.
Auf der anderen Seite sagen:
$ false # Exit code: 1
$ a="" # Exit code: 0
$ echo $? # Prints 0
bewirkt den Exitcode für die Zuordnung zu a
zurückgegeben werden soll, also 0
.
BEARBEITEN:
Zitat aus dem Handbuch:
Wenn eine der Erweiterungen eine Befehlsersetzung enthielt, ist der Ausgangsstatus des Befehls der Ausgangsstatus der letzten durchgeführten Befehlsersetzung.
Zitat aus BASHFAQ/002:
Wie kann ich den Rückgabewert und/oder die Ausgabe eines Befehls in einer Variablen speichern?
...
output=$(command)
status=$?
Die Zuordnung zu output
hat keine Auswirkung auf command
den Exit-Status von , der immer noch auf $?
steht .