Variáveis e funções residem em diferentes namespaces no dash e isso também é especificado pelo POSIX :
A implementação deve manter espaços de nomes separados para funções e variáveis.
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 :
A descrição das funções em uma proposta inicial foi baseada na noção de que as funções deveriam se comportar como scripts de shell em miniatura; isto é, exceto no compartilhamento de variáveis , a maioria dos elementos de um ambiente de execução deve se comportar como se fosse um novo ambiente de execução, [..]
[..] Variáveis locais dentro de uma função foram consideradas e incluídas em outra proposta anterior (controlada pelo built-in especial local
), mas foram removidas porque não se encaixam no modelo simples desenvolvido para as funções e porque havia alguma oposição em adicionar ainda outro novo embutido especial que não fazia parte da prática histórica. As implementações devem reservar o identificador local
(assim como typeset
o KornShell), caso esse mecanismo de variável local seja adotado em uma versão futura deste padrão.
(ênfase minha)
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.