Bash: Exit-Code der Variablenzuweisung zur Befehlssubstitution
Ich bin verwirrt darüber, was als Fehler-code das Kommando gibt bei der Ausführung eine variable Zuordnung klar und deutlich und mit command substitution:
a=$(false); echo $?
Gibt es 1
die lassen mich denken, dass variable Zuweisung nicht fegen oder produzieren neue Fehler-code, der auf dem letzten. Aber als ich versuchte dieses:
false; a=""; echo $?
Gibt es 0
dies ist offensichtlich, was a=""
gibt und es überschreiben 1
zurückgegeben false
.
Möchte ich wissen, warum dies geschieht, ist es keine Besonderheit in der Variablen Zuordnung, unterscheidet sich von anderen normalen Befehlen? Oder einfach nur Ursache a=$(false)
ist als mit einem einzigen Befehl nur Substitutionen Teil Sinn?
-- UPDATE --
Danke an alle, aus der Antworten und Kommentare, ich habe den Punkt, "Wenn Sie einer Variablen zuweisen mit dem Befehl substitution, der exit-status ist der status des Befehls." (von @Barmar), diese Erklärung ist hervorragend klar und einfach zu verstehen, aber Sie sprechen nicht präzise genug für den Programmierer möchte ich sehen, der Hinweis von diesem Punkt aus Behörden wie der TLDP-oder GNU-Mann-Seite, bitte helfen Sie mir, finden Sie es heraus, nochmals vielen Dank!
InformationsquelleAutor der Frage Reorx | 2013-11-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beim ausführen eines Befehls als
$(command)
ermöglicht die Ausgabe des Befehls zu ersetzen, die sich.Wenn Sie sagen:
den output produziert, der durch den Befehl
false
wird in der Variablen gespeicherta
. Außerdem, der exit-code ist der gleiche wie hergestellt, der durch den Befehl.help false
würde sagen:Auf der anderen hand, und sagte:
Ursachen der exit-code für die Zuordnung zu
a
zurückgegeben werden, die0
.EDIT:
Zitat aus dem Handbuch:
Zitat aus BASHFAQ/002:
InformationsquelleAutor der Antwort devnull
Beachten, dass dies nicht der Fall, wenn mit
local
innerhalb einer Funktion. Die ist subtil anders Verhalten als beschrieben, in der die akzeptierte Antwort, und den link hier gepostet: http://mywiki.wooledge.org/BashFAQ/002Nehmen Sie dieses bash-Skript zum Beispiel:
Hier ist die Ausgabe:
Vielleicht niemanden interessiert, aber ich Tat. Es dauerte eine minute, um herauszufinden, warum mein status code war immer 0, wenn es war eindeutig nicht manchmal. Nicht 100% klar, warum. Aber nur das wissen, das half.
InformationsquelleAutor der Antwort Nick P.
(nicht eine Antwort auf die ursprüngliche Frage, aber zu lang für einen Kommentar)
Beachten Sie, dass
export A=$(false); echo $?
Ausgänge 0! Anscheinend sind die Regeln zitiert in devnull Antwort nicht mehr gelten. Um ein bisschen Kontext zu zitieren (Hervorhebung von mir):IIUC der Anleitung beschrieben
var=foo
als Spezialfallvar=foo command...
syntax (ziemlich verwirrend!). Die "exit-status des letzten Befehls-substitution" - Regel gilt nur für die nicht-Befehl case.Während es verlockend, zu denken, der
export var=foo
als eine "modifizierte Zuordnung syntax", ist es nichtexport
ist ein builtin-Kommando (es passiert einfach zu nehmen Abtretung-wie args).=> Wenn Sie möchten, exportieren Sie eine var-UND capture-Kommando-substitution status, tun Sie es in 2 Stufen:
Diese Weise funktioniert auch in
set -e
Modus sofort beendet, wenn der Befehl substitution nicht zurück-0.InformationsquelleAutor der Antwort Beni Cherniavsky-Paskin