Estou ficando confuso sobre como definir variáveis locais em funções bash.
Parece que usando
local dgt
local ltr
local braces
local da
pode ser mais seguro do que usar
local dgt ltr braces da
Estou preocupado com a possibilidade de uma variável não ser definida como local ou não ter o valor definido. Isso poderia acontecer?
Por exemplo, considere
local foo="$(mycmd)"
O status de saída do comando é substituído pelo status de saída da criação da variável local.
Então o código correto seria
local foo
foo=$(mycmd)
Ele também será definido desde que o próprio comando local esteja inicialmente correto sintaticamente. O comando local não se preocupa com o valor de saída de qualquer substituição de comando (que executa em um subshell) que pode acontecer antes ou depois da avaliação do comando local.
Isso é verdade pelo menos intencionalmente. No entanto, os bugs podem não fazer com que funcione da maneira que você espera, principalmente ao definir valores de array em versões anteriores do Bash. Portanto, separar a definição da declaração pode ser melhor, às vezes.
FWIW, algumas diferenças:
Observe que o bash, ao contrário de muitos outros shells, não permite que você decalque uma variável como
local
se ela tivesse sido declarada comoreadonly
em um escopo pai. Ainda assim, como forlocal Ûnsupported¹ other_var
, inlocal readonly_var other_var
, acho que inbash
,other_var
ainda acaba sendo declarado comolocal
.¹
local Ûnsupported
realmente funciona embash
, mas apenas em locais onde issoÛ
é codificado em um único byte (e é classificado comoisalpha()
).