Espacios de nombres separados para funciones y variables en shells POSIX

Espacios de nombres separados para funciones y variables en shells POSIX

En el guión, las funciones y variables parecen vivir en espacios de nombres separados:

fn(){
    fn="hello world"
}
fn; echo "The value is $fn!" #prints: The value is hello world!
fn; echo "The value is $fn!" #prints: The value is hello world!
#the fn variable doesn't conflict with the fn function

¿Es esta una característica específica del tablero o una garantía POSIX?

Respuesta1

Una garantía:

2.9.5 Comando de definición de función

Una función es un nombre definido por el usuario que se utiliza como un comando simple para llamar a un comando compuesto con nuevos parámetros posicionales. Una función se define con un "comando de definición de función".[...]

La función se llama fname; la aplicación deberá asegurarse de que sea un nombre (consulte Nombre XBD) y que no sea el nombre de una utilidad incorporada especial. Una implementación puede permitir otros caracteres en el nombre de una función como extensión.La implementación mantendrá espacios de nombres separados para funciones y variables.

Respuesta2

Las variables y funciones residen en diferentes espacios de nombres en el guión y esto también se especifica mediantePOSIX:

La implementación mantendrá espacios de nombres separados para funciones y variables.

Además de eso, las variables tienen alcance global, de forma predeterminada. Algunos shells (por ejemplo, bash, ksh y zsh) proporcionan la localpalabra clave para declarar variables en una función con alcance local únicamente.

Entonces, sí, POSIX garantiza el comportamiento que está viendo.

POSIX no lo ha hechoestandarizado local,todavía:

La descripción de funciones en una de las primeras propuestas se basó en la noción de que las funciones deberían comportarse como scripts de shell en miniatura; eso es,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 fueron consideradas e incluidas en otra propuesta inicial (controlada por el especial incorporado local), perofueron eliminadosporque no se ajustan al modelo simple desarrollado para funciones y porque hubo cierta oposición a agregar otro nuevo incorporado especial que no formaba 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.

(el énfasis es mío)

información relacionada