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?
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.Respuestas:
Una garantía :
fuente
unset
tiene-v
y-f
para 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á lafoo
función deunset foo
si no hayfoo
variable (!), un comportamiento permitido por POSIX. Es por eso que en los scripts POSIX es una buena práctica usar siempre uno-v
o-f
(y, por supuesto, también en losbash
scripts, pero tenga en cuenta queunset
no siempre puede desarmar una variablebash
, elbash
alcance 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
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 :(é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 ksh93typeset
proporciona un alcance local (estático) solo en funciones declaradas usando la sintaxis ksh).