Antworten:
Im:
a=$(cmd)
Dies ist ein einfacher Befehl ohne Befehlsteil. Der Exit-Status ist also der der Befehlsersetzung. Im:
a=$(cmd) export a
oder
export a="$(cmd)"
Hier gibt es einen Befehlsteil (auch wenn er sich in einigen Shells auf export
halbem Weg zwischen einem Befehl und einem Schlüsselwort befindet), sodass sein Beendigungsstatus zurückgegeben wird. Wenn ein cmd
Fehler auftritt und keine Ausgabe erzeugt wird, export a=
wird er weiterhin ausgeführt und ist erfolgreich. Daher export
wird der Exit-Status 0 zurückgegeben.
Hier möchten Sie:
a=$(cmd)
export a
Oder noch besser, beseitigen Sie diese Unzuverlässigkeit set -e
und führen Sie die richtige Fehlerbehandlung von Hand durch:
a=$(cmd) || exit
export a
Siehe zB BashFAQ 015: "Warum macht set -e nicht das, was ich erwartet habe?" Weitere Beispiele dafür, warum und wie set -e
unerwartete Ergebnisse erzielt werden können.