El uso de caracteres Unicode extendidos es (sin duda) útil para muchos usuarios.
Los shells más simples (ash (busybox), dash) y ksh fallan con:
tést() { echo 34; }
tést
Pero bash , mksh , lksh y zsh parecen permitirlo.
Soy consciente de que los nombres de función válidos POSIX utilizan esta definición de nombres . Eso significa esta expresión regular:
[a-zA-Z_][a-zA-Z0-9_]*
Sin embargo, en el primer enlace también se dice:
Una implementación puede permitir otros caracteres en el nombre de una función como una extensión.
Las preguntas son:
- ¿Es esto aceptado y documentado?
- ¿Dónde?
- ¿Para qué conchas (si las hay)?
Preguntas relacionadas: ¿
Es posible usar caracteres especiales en un nombre de función de shell?
No estoy interesado en usar metacaracteres (>) en los nombres de funciones.
Nombres de funciones de arranque y bash que contienen “-”
No creo que un operador (resta "-") deba ser parte de un nombre.
alias
ser un poco más indulgente. para que pueda escribir la función con un nombre apropiado y abotonado, y luego simplemente definir un alias con más estilo para llamar a la función. endash
también hay algunas cosas que puede hacer con$PATH
y%func
.Respuestas:
Dado que la documentación POSIX lo permite como una extensión, no hay nada que impida la implementación de ese comportamiento.
Una verificación simple (corrió
zsh
):demostrar que
bash
,zsh
,yash
,ksh93
(queksh
hay enlaces en mi sistema),pdksh
y su derivación permite múltiples bytes caracteres como nombre de la función.yash
está diseñado para admitir caracteres multibyte desde el principio, por lo que no sorprende que haya funcionado.La otra documentación que puede consultar es
ksh93
:Entonces configurando a
C
locale:hazlo fallar.
fuente
posh
No vale la pena ser incluido en esa lista. Depende de errores específicos de Linuxlibc
y no funcionará en otras plataformas.ksh93
uso de un ksh93 autocompilado de fuentes originales. Si bienksh88
parece aceptar letras no ASCII de 7 bits para los nombres de funciones, solo elksh93
binario de Ubuntu parece aceptarlas.Tenga en cuenta que las funciones comparten el mismo espacio de nombres que otros comandos, incluidos los comandos en el sistema de archivos, que en la mayoría de los sistemas no tienen limitación en los caracteres o incluso bytes que pueden contener en su ruta.
Entonces, si bien la mayoría de los shells restringen los caracteres de sus funciones, no hay una buena razón por la que lo hagan. Eso significa que en esos shells, hay comandos que no puedes reemplazar con una función.
zsh
yrc
permita cualquier cosa para sus nombres de función, incluidos algunos con/
y la cadena vacía.zsh
incluso permite bytes NUL.Un comando simple en shell es una lista de argumentos, y el primer argumento se usa para derivar el comando a ejecutar. Por lo tanto, es lógico que esos argumentos y nombres de funciones compartan los mismos valores posibles y en los
zsh
argumentos a las funciones y funciones incorporadas pueden ser cualquier secuencia de bytes.No hay ningún problema de seguridad aquí, ya que las funciones que usted (el autor del script) define son las que invoca.
Donde puede haber problemas de seguridad es cuando el análisis afecta al entorno, por ejemplo, con shells donde los nombres válidos para las funciones se ven afectados por la configuración regional.
fuente
function /bin/sh { echo "$0: $FUNCNAME: Permission denied"; return 126; }
, y potencialmente cosas útiles también con funciones con nombre--
,//
,@
o%
etc/
se encuentran en un nombre? y una función no es solo un nombre ejecutable: su código. Creo que una implementación simple podría encontrar muchos problemas de análisis si los nombres de las funciones almacenadas incluyen metacaracteres.