Nombres de funciones de script Bash que contienen dos puntos ''

17

Me encontré con un script de Bash hoy que tiene nombres de funciones con dos puntos dobles ::en ellos, por ejemplo, file::write()y file::read(). Nunca antes había visto esta sintaxis en un script Bash, y cuando invoqué el script funcionó bien (para mi sorpresa).

Después de recorrer la página de manual de Bash en mi sistema (y en línea), no puedo encontrar nada en la documentación que admita esta sintaxis para los nombres de funciones. Por ejemplo, la sección Shell Defined Functionsdefine la sintaxis para que una función de shell sea

function name [()] compound-command [redirection]

y luego (en otra parte del manual) el token namese define 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.

No se menciona en ninguna parte la sintaxis de dos puntos dobles para los nombres de funciones.

La única otra referencia a esta sintaxis dos puntos dobles que he encontrado hasta ahora es en esta Guía de Estilo de la carcasa (véase la subsección Naming Conventions > Function Names) que recomienda el uso de la sintaxis de dos puntos dobles para los nombres de función en "paquetes" - por ejemplo, mypackage::myfunction().

¿Es esta sintaxis de dos puntos dobles para los nombres de funciones una característica legítima del shell Bash, o es quizás una característica no documentada? Si es legítimo, ¿dónde está documentado en el manual de Bash? He buscado y buscado pero no puedo encontrar nada al respecto en el manual. Lo más cercano que he encontrado es el uso de ::la PATHvariable de entorno para agregar el directorio de trabajo actual a la ruta de búsqueda.

EJEMPLO

#!/bin/bash
function abc::def() {
    echo "${FUNCNAME[0]}"
}
abc::def

Probé este script en tres distribuciones de Linux diferentes, y en los tres el script se imprime abc::defen stdout.

Jim Fischer
fuente
También se puede ver %%en los nombres de funciones unix.stackexchange.com/questions/401166/…
michael
Gracias por los enlaces. Impar. Antes de publicar, busqué "bash double colon" (sin las comillas) pero no encontré nada. Disculpas por volver a hacer una pregunta ya respondida. .
Jim Fischer

Respuestas:

16

Este es un caso en el que la documentación es más estricta que la implementación, posiblemente en un intento de reducir el factor de pistolas. Esto se ha discutido aquí antes ; vea también la prueba exhaustiva que establece que, por ejemplo, [}{es un nombre de función válido.

También vale la pena señalar que abc::defno es un nombre de variable válido:

$ abc::def=foo
bash: abc::def=foo: command not found
l0b0
fuente
44
solo para dejarlo muy claro: file::readni [}{posix es válido
Steven Penny