Nomes de funções de script bash contendo dois-pontos '::'

17

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 Functionsdefine 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 PATHvariá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::defem stdout.

Jim Fischer
fonte
Eles são permitidos - stackoverflow.com/questions/44558080/…
slm
Pode-se ver também %%em nomes de função unix.stackexchange.com/questions/401166/...
michael
Obrigado pelos links. Ímpar. Antes de postar, procurei "bash double colon" (sem as aspas), mas não encontrei nada. Desculpas por fazer novamente uma pergunta já respondida. .
21718 Jim Fischer

Respostas:

16

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::defnão é um nome de variável válido:

$ abc::def=foo
bash: abc::def=foo: command not found
l0b0
fonte
4
apenas para torná-lo vividamente clara - não file::read, nem [}{é posix válida
Steven Penny