Der Bash-Export ignoriert set -ex

7

Ich bin heute auf ein seltsames Verhalten gestoßen:

#!/bin/bash
set -ex
export a=$(cat foo)
echo "It's a living thing"
b=$(cat foo)
echo "This won't make it"

Dies hört nicht auf cat foo, obwohl fooes nicht existiert. Aber ohne den Export schlägt es fehl. Warum?

David
quelle

Antworten:

15

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.

Stéphane Chazelas
quelle
Siehe zum Beispiel mywiki.wooledge.org/…
Stéphane Chazelas
1
ITYM mywiki.wooledge.org/BashFAQ/105
Toby Speight