No traço, funções e variáveis parecem viver em espaços para nome separados:
fn(){
fn="hello world"
}
fn; echo "The value is $fn!" #prints: The value is hello world!
fn; echo "The value is $fn!" #prints: The value is hello world!
#the fn variable doesn't conflict with the fn function
Isso é um recurso específico do traço ou uma garantia POSIX?
fn
função está em um espaço para nome separado; se executá-lo uma vez eliminasse sua definição, veríamos exatamente o mesmo comportamento. Você deve mostrar que a função ainda está definida, por exemplo,type fn
posteriormente.Respostas:
Uma garantia :
fonte
unset
tem-v
e-f
para escolher entre desmarcar a variável ou função pelo nome fornecido.bash
(em oposição à maioria dos outros conchas) irá retirar afoo
função comunset foo
se não há nenhumafoo
variável (!), um comportamento permitido pelo POSIX. É por isso que, nos scripts POSIX, é uma boa prática sempre usar um-v
ou-f
(e, é claro, também nosbash
scripts, mas observe queunset
nem sempre é possível desmarcar uma variávelbash
, obash
escopo de variáveis tem muitos problemas).Variáveis e funções residem em diferentes namespaces no dash e isso também é especificado pelo POSIX :
Além disso, as variáveis têm escopo global, por padrão. Alguns shells (por exemplo, bash, ksh e zsh) fornecem a
local
palavra-chave para declarar variáveis em uma função apenas com escopo local.Portanto, sim, o comportamento que você está vendo é garantido pelo POSIX.
POSIX não padronizado
local
, ainda :(ênfase minha)
fonte
local
, uma das interfaces mais consistentes por aí (em comparação com a severamente quebrada no bash, por exemplo), bash apenas recentemente (4.4) pegou emprestado olocal -
(para escopo local para opções) do ash (implementando o escopo no estilo ash$-
apenas para essa variável). O ksh e o yash não possuemlocal
(apenas as variantes do pdkshlocal
), mastypeset
sim (no ksh93typeset
fornece escopo local (estático) apenas em funções declaradas usando a sintaxe ksh).