Por que não exportar variáveis ​​na mesma linha que você as atribui?

44

De Qual é o último argumento do comando anterior?

O shellcheck diz para você não exportar variáveis ​​na mesma linha que você as atribui.

Eu queria saber por que?

O mesmo conselho se aplica a alias, declare, export, local, readonly, e typeset?

Tim
fonte
9
A regra de verificação de shell em questão é SC2155. Existe uma documentação muito boa no wiki do shellcheck .
phunehehe
3
Além disso, algumas conchas mais antigas não aceitariam exporte designariam juntas. O Heirloom Bourne Shell , por exemplo, gera um erro "foo = 2 não é um identificador".
Dennis Williamson

Respostas:

54

O problema é que, no Bash, todos os comandos têm apenas um código de saída. Quando você export foo="$(false)"o código de saída falseé simplesmente descartado. Se você preferir

foo="$(false)"
export foo

o primeiro comando com falha pode ser acionado, por exemplo, pela errexitconfiguração.

Declarar e atribuir uma string literal, como export foo='bar'é claro, não sofre com esse problema. Mas a mudança é a única constante no desenvolvimento de software, e é simplesmente uma boa tarefa de arrumar essas declarações à prova de futuro, dividindo-as.

Além dos comandos específicos de atribuição mencionados, também existem vários comandos em uma única atribuição, como foo="$(false)$(true)". Veja pipefailem man bashpara mais uma tal armadilha.

Outra coisa a lembrar é que a sequência de declaração e atribuição às vezes é relevante. Por exemplo, você desejará declarar variáveis antes de atribuí-las. (Infelizmente, não é possível declarar variáveis antes de atribuí-las pela primeira vez.)local readonly

l0b0
fonte
Portanto, se alguém estiver definindo uma variável a partir de um literal e não houver código de saída para descartar, não há nada errado em fazer tudo em uma linha.
perfil completo de Monty Harder
1
No que diz respeito a este erro de verificação de shell, não. Mas como as respostas agora excluídas ficaram pela metade entre elas, o shell Bourne não suportava a sintaxe da atribuição export; portanto, por alguns anos, foi recebido um conhecimento sobre isso, se o intérprete provavelmente fosse o shell Bourne.
JdeBP
@JdeBP, observe que o shell Bourne deu suporte foo=$(cmd) export foo, embora com a mesma ressalva de que cmdo status de saída seja perdido (mas causou o encerramento do shell se falhar set -e).
Stéphane Chazelas 18/04/19
Isso foi coberto pela minha primeira frase.
JdeBP