Las variables y funciones residen en diferentes espacios de nombres en el guión y esto también lo especifica POSIX :
La implementación mantendrá espacios de nombres separados para funciones y variables.
Además de eso, las variables tienen alcance global, por defecto. Algunos shells (por ejemplo, bash, ksh y zsh) proporcionan la local
palabra clave para declarar variables en una función solo con alcance local.
Entonces, sí, el comportamiento que está viendo está garantizado por POSIX.
POSIX no ha estandarizado local
, sin embargo :
La descripción de las funciones en una propuesta inicial se basaba en la noción de que las funciones deberían comportarse como scripts de shell en miniatura; es decir, excepto para compartir variables , la mayoría de los elementos de un entorno de ejecución deberían comportarse como si fueran un nuevo entorno de ejecución, [..]
[..] Las variables locales dentro de una función se consideraron e incluyeron en otra propuesta inicial (controlada por el incorporado especial local
), pero se eliminaron porque no se ajustan al modelo simple desarrollado para las funciones y porque había cierta oposición a agregar aún Otro nuevo especial incorporado que no era parte de la práctica histórica. Las implementaciones deben reservar el identificador local
(así como typeset
, como se usa en KornShell) en caso de que este mecanismo de variable local se adopte en una versión futura de este estándar.
(énfasis mío)
fn
función esté en un espacio de nombres separado; si ejecutarlo una vez hubiera borrado su definición, veríamos exactamente el mismo comportamiento. Debe mostrar que la función aún está definida, por ejemplo, contype fn
después.