Hoje me deparei com um script do Bash que tem nomes de função com dois pontos duplos ::
, por exemplo, file::write()
efile::read()
. Eu nunca vi essa sintaxe antes em um script do Bash e, quando invoquei o script, ele correu muito bem (para minha surpresa).
Depois de vasculhar a página de manual do Bash no meu sistema (e on-line), não consigo encontrar nada na documentação que suporte essa sintaxe para nomes de funções. Por exemplo, a seção Shell Defined Functions
define a sintaxe para uma função shell a ser
function name [()] compound-command [redirection]
e então (em outra parte do manual) o token name
é definido como
name A word consisting only of alphanumeric characters and
underscores, and beginning with an alphabetic character
or an underscore. Also referred to as an identifier.
Não há menção em nenhum lugar da sintaxe de dois pontos para nomes de funções.
A única outra referência a essa sintaxe de dois pontos que encontrei até agora está neste Guia de Estilo do Shell (consulte a subseção Naming Conventions > Function Names
) que recomenda o uso da sintaxe de dois pontos para nomes de funções em "pacotes" - por exemplo,mypackage::myfunction()
,.
Essa sintaxe de dois pontos duplos para nomes de funções é um recurso legítimo do shell Bash ou talvez seja um recurso não documentado? Se for legítimo, onde está documentado no manual do Bash? Eu olhei e olhei, mas não consigo encontrar nada sobre isso no manual. O mais próximo que encontrei é o uso de ::
na PATH
variável de ambiente para adicionar o diretório de trabalho atual ao caminho de pesquisa.
EXEMPLO
#!/bin/bash
function abc::def() {
echo "${FUNCNAME[0]}"
}
abc::def
Testei esse script em três distros diferentes do Linux e, nas três, o script é impresso abc::def
em stdout.
fonte
%%
em nomes de função unix.stackexchange.com/questions/401166/...Respostas:
Este é o caso da documentação ser mais rigorosa que a implementação, possivelmente na tentativa de diminuir o fator de arma de fogo. Isso já foi discutido aqui antes ; veja também o teste exaustivo que estabelece que, por exemplo,
[}{
é um nome de função válido.Também pode ser interessante notar que
abc::def
não é um nome de variável válido:fonte
file::read
, nem[}{
é posix válida