Eu me deparei com um script Bash hoje que tem nomes de funções com dois-pontos duplos ::
neles, por exemplo, file::write()
e file::read()
. Eu nunca vi essa sintaxe antes em um script Bash e, quando invoquei o script, ele funcionou bem (para minha surpresa).
Depois de vasculhar a página man do Bash no meu sistema (e online), 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 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 Shell Style Guide (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 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? Procurei e procurei, mas não encontro 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
Eu testei este script em três distribuições Linux diferentes e em todas as três o script imprime abc::def
em stdout.
Este é o caso da documentação ser mais rigorosa do que a implementação, possivelmente na tentativa de diminuir o fator footgun. Isso já foi discutido aqui antes ; veja também o teste exaustivo estabelecendo que, por exemplo
[}{
, é um nome de função válido.Também pode valer a pena notar que
abc::def
não é um nome de variável válido: