Exportação bash ignora set -ex

7

Eu me deparei com um comportamento estranho hoje:

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

Isso não será interrompido em cat foo , mesmo que foo não exista. Mas sem a exportação, falha. Por quê?

    
por David 27.02.2018 / 14:58

1 resposta

16

Em:

a=$(cmd)

Esse é um comando simples sem parte de comando, então o status de saída é o da substituição do comando. Em:

a=$(cmd) export a

ou

export a="$(cmd)"

Há uma parte do comando aqui (mesmo se em alguns shells, export está no meio do caminho entre um comando e uma palavra-chave), portanto, seu status de saída é retornado. Se cmd falhar e não produzir saída export a= ainda será executado e bem-sucedido, então export retornará um status de saída 0.

Aqui você deseja:

a=$(cmd)
export a

Ou, melhor ainda, livre-se desse set -e não confiável e faça o tratamento adequado de erros manualmente:

a=$(cmd) || exit
export a

Ver, por exemplo, BashFAQ 015: "Por que não define -e faz o que eu esperava?" para exemplos adicionais de por que e como set -e pode produzir resultados inesperados.

    
por 27.02.2018 / 15:04