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
?
export
e designariam juntas. O Heirloom Bourne Shell , por exemplo, gera um erro "foo = 2 não é um identificador".Respostas:
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ídafalse
é simplesmente descartado. Se você preferiro primeiro comando com falha pode ser acionado, por exemplo, pela
errexit
configuraçã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)"
. Vejapipefail
emman bash
para 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
fonte
export
; portanto, por alguns anos, foi recebido um conhecimento sobre isso, se o intérprete provavelmente fosse o shell Bourne.foo=$(cmd) export foo
, embora com a mesma ressalva de quecmd
o status de saída seja perdido (mas causou o encerramento do shell se falharset -e
).