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

15

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.

    
por Jim Fischer 20.08.2018 / 06:10

1 resposta

15

Este é um caso de a documentação ser mais rigorosa do que a implementação, possivelmente em uma tentativa de diminuir o fator de arma curta. Isso foi discutido aqui antes ; veja também o teste exaustivo estabelecendo 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:

$ abc::def=foo
bash: abc::def=foo: command not found
    
por 20.08.2018 / 06:21