O problema é que no Bash todo comando tem apenas um código de saída. Quando você export foo="$(false)"
o código de saída de false
é simplesmente descartado. Se você, ao invés disso, fizer
foo="$(false)"
export foo
o primeiro comando com falha pode ser usado, por exemplo, pela configuração errexit
.
Declarar e atribuir um literal de string, como export foo='bar'
, obviamente não sofre desse problema. Mas a mudança é a única constante no desenvolvimento de software, e é simplesmente uma boa administração para que essas declarações sejam preparadas para o futuro, dividindo-as.
Além dos comandos específicos da atribuição que você menciona, há também vários comandos em uma única atribuição, como foo="$(false)$(true)"
. Consulte pipefail
em man bash
para mais uma armadilha desse tipo.
Outra coisa a lembrar é que a sequência de declaração e atribuição é por vezes relevante. Por exemplo, você desejará declarar variáveis local
antes atribuindo-os. (Infelizmente não é possível declarar variáveis readonly
antes de atribuí-los pela primeira vez.)