Exit-code der variable Zuordnung Kommando-substitution in Bash
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 ein. 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!
- TLDP ist keine zuverlässige Quelle-das ABS ist geradezu berüchtigt für die Präsentation von schlechten Praktiken in bash viel wie w3schools ist in der JavaScript-Welt.
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:
local
Variablen (z.B.local output=$(command)
), weillocal
ist ein Befehl sich und den exit-code überschrieben werden, die der zugewiesenen Funktion.local
s, kann dies leicht umgangen werden, indem die Initialisierung nach der Erklärung, es sei denn, die variable ist auchreadonly
:local my_var; my_var=$(command); local status=$?
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 dieses:
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.
local
(ebenfalls fürexport
) ist ein bash-builtin-Funktion, und die Art wie es aufgerufen wird, mit der ersten Beispiel-Ergebnis in einen Erfolg, also eine0
exit-code.Stieß ich auf das gleiche problem gestern (Aug 29 2018).
Neben
local
erwähnt in Nick P. s Antwort und @sevko Kommentar in der akzeptierte Antwort,declare
im globalen Rahmen hat auch das gleiche Verhalten.Hier ist mein Bash-code:
Die Ausgabe:
Hinweis: die Werte von
local_ret2
undglobal_ret2
in der obigen Ausgabe. Die exit-codes überschrieben werden, indem Sielocal
unddeclare
.Meine Bash-version:
(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.