From Was ist das letzte Argument des vorherigen Befehls?
Shellcheck weist Sie an, keine Variablen in dieselbe Zeile zu exportieren, die Sie ihnen zuweisen.
Ich habe mich gefragt, warum?
Hat der gleiche Rat gilt alias
, declare
, export
, local
, readonly
, und typeset
?
export
gemeinsame Aufgabe nicht annehmen . Die Heirloom Bourne Shell gibt beispielsweise den Fehler "foo = 2 ist kein Bezeichner" aus.Antworten:
Das Problem ist, dass in Bash jeder Befehl nur einen Exit-Code hat. Bei Ihnen wird
export foo="$(false)"
der Exit-Code vonfalse
einfach verworfen. Wenn du es stattdessen tustAuf den fehlgeschlagenen ersten Befehl kann beispielsweise durch die
errexit
Einstellung reagiert werden.Das Deklarieren und Zuweisen eines String-Literales wie dieses
export foo='bar'
leidet natürlich nicht an diesem Problem. Aber Veränderung ist die einzige Konstante in der Softwareentwicklung, und es ist einfach eine gute Sache, solche Aussagen zukunftssicher zu machen, indem man sie aufteilt.Zusätzlich zu den von Ihnen erwähnten zuweisungsspezifischen Befehlen gibt es auch mehrere Befehle in einer einzelnen Zuweisung, wie z
foo="$(false)$(true)"
. Siehepipefail
inman bash
für einen weiteren solchen Falle.Eine andere Sache, an die man sich erinnern sollte, ist, dass die Reihenfolge der Deklaration und Zuordnung manchmal relevant ist. Beispielsweise möchten Sie Variablen deklarieren, bevor Sie sie zuweisen. (Leider ist es nicht möglich, Variablen zu deklarieren, bevor Sie sie zum ersten Mal zuweisen.)
local
readonly
quelle
export
für nicht. Einige Jahre lang gab es die Weisheit, dies zu tun, wenn der Interpreter wahrscheinlich die Bourne-Shell sein sollte.foo=$(cmd) export foo
, jedoch mit demselben Vorbehalt, mit dem der Beendigungsstatuscmd
verloren gegangen ist (jedoch wurde die Shell beendet, wenn ein Fehler auftratset -e
).