Namespaces separados para funções e variáveis ​​em shells POSIX

Namespaces separados para funções e variáveis ​​em shells POSIX

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

Uma garantia:

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 localpalavra-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 identificador local(bem como typeset, conforme usado no KornShell) caso este mecanismo de variável local seja adotado em uma versão futura deste padrão.

(ênfase minha)

informação relacionada