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 guión o una garantía POSIX?

fnfunció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 fndespués.Respuestas:
Una garantía :
fuente
unsettiene-vy-fpara elegir entre desarmar la variable o función por el nombre dado.bash(a diferencia de la mayoría de las otras conchas) se desarmará lafoofunción deunset foosi no hayfoovariable (!), un comportamiento permitido por POSIX. Es por eso que en los scripts POSIX es una buena práctica usar siempre uno-vo-f(y, por supuesto, también en losbashscripts, pero tenga en cuenta queunsetno siempre puede desarmar una variablebash, elbashalcance de la variable tiene bastantes problemas).Las variables y funciones residen en diferentes espacios de nombres en el guión y esto también lo especifica POSIX :
Además de eso, las variables tienen alcance global, por defecto. Algunos shells (por ejemplo, bash, ksh y zsh) proporcionan la
localpalabra 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 :(énfasis mío)
fuente
local, una de las interfaces más consistentes que existen (en comparación con la severamente rota en bash, por ejemplo), bash solo recientemente (4.4) tomó prestado ellocal -(para el alcance local para opciones) de ash (implementando un alcance de estilo ash solo para esa$-variable). ksh y yash no tienenlocal(solo las variantes pdksh tienenlocal), sino que tienentypeset(en ksh93typesetproporciona un alcance local (estático) solo en funciones declaradas usando la sintaxis ksh).