No traço, funções e variáveis parecem residir em namespaces 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
Este é um recurso específico do painel ou uma garantia POSIX?
Responder1
2.9.5 Comando de Definição de Função
Uma função é um nome definido pelo usuário usado como um comando simples para chamar um comando composto com novos parâmetros posicionais. Uma função é definida com um "comando de definição de função".[...]
A função é denominada fname; o aplicativo deve garantir que seja um nome (consulte Nome XBD) e que não seja o nome de um utilitário especial integrado. Uma implementação pode permitir outros caracteres em um nome de função como extensão.A implementação deve manter espaços de nomes separados para funções e variáveis.
Responder2
Variáveis e funções residem em diferentes namespaces no dash e isso também é especificado porPOSIX:
A implementação deve manter espaços de nomes separados para funções e variáveis.
Além disso, as variáveis possuem 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.
Então sim, o comportamento que você está vendo é garantido pelo POSIX.
POSIX nãopadronizado local
,ainda:
A descrição das funções em uma proposta inicial baseava-se na noção de que as funções deveriam se comportar como scripts de shell em miniatura; aquilo é,exceto para compartilhar variáveis, a maioria dos elementos de um ambiente de execução devem se comportar como se fossem um novo ambiente de execução, [..]
[..] Variáveis locais dentro de uma função foram consideradas e incluídas em outra proposta inicial (controlada pelo embutido especial
local
), masforam removidosporque não se enquadram no modelo simples desenvolvido para funções e porque houve alguma oposição à adição de mais um novo elemento especial que não fazia parte da prática histórica. As implementações devem reservar o identificadorlocal
(bem comotypeset
, conforme usado no KornShell) caso este mecanismo de variável local seja adotado em uma versão futura deste padrão.
(ênfase minha)