Eu me deparei com um script Bash hoje que tem nomes de função com dois-pontos duplos ::
, por exemplo, file::write()
e file::read()
. Eu nunca vi essa sintaxe antes em um script do Bash, e quando invoquei o script ele correu bem (para minha surpresa).
Após vasculhar a página man do Bash no meu sistema (e online) não consigo encontrar nada na documentação que suporte esta sintaxe para nomes de função. Por exemplo, a seção Shell Defined Functions
define a sintaxe para uma função do shell como
function name [()] compound-command [redirection]
e depois (em outras partes 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 da sintaxe de dois pontos para nomes de função.
A única outra referência a essa sintaxe de dois pontos que encontrei até agora é neste Shell Style Guide (veja a subseção Naming Conventions > Function Names
) que recomenda usar a sintaxe de dois pontos para nomes de função em "pacotes" - por exemplo, mypackage::myfunction()
.
Esta sintaxe de dois pontos para nomes de funções é uma característica legítima do shell Bash, ou talvez seja um recurso não documentado? Se é 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 variável de ambiente PATH
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 diferentes distros do Linux, e em todos os três o script imprime abc::def
para stdout.