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 exporthalbem Weg zwischen einem Befehl und einem Schlüsselwort befindet), sodass sein Beendigungsstatus zurückgegeben wird. Wenn ein cmdFehler auftritt und keine Ausgabe erzeugt wird, export a=wird er weiterhin ausgeführt und ist erfolgreich. Daher exportwird der Exit-Status 0 zurückgegeben.
Hier möchten Sie:
a=$(cmd)
export a
Oder noch besser, beseitigen Sie diese Unzuverlässigkeit set -eund 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 -eunerwartete Ergebnisse erzielt werden können.