В dash функции и переменные, кажется, живут в отдельных пространствах имен:
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
Это особенность тире или гарантия POSIX?
fn
функция находится в отдельном пространстве имен; если бы его выполнение однажды стерло его определение, мы бы увидели точно такое же поведение. Вы должны показать, что функция все еще определена, например, сtype fn
после.Ответы:
Гарантия :
источник
unset
есть-v
и-f
выбирать между отменой установки переменной или функции по заданному имени.bash
(в отличие от большинства других оболочек) будет сбросить наfoo
функцию с ,unset foo
если нетfoo
переменной (!), поведение , допускаемое POSIX. Вот почему в сценариях POSIX это хорошая практика , чтобы всегда использовать либо-v
или-f
(и, конечно , вbash
сценариях , а также, но учтите , чтоunset
не всегда может UNSET переменной вbash
,bash
переменная обзорное имеет довольно много проблем).Переменные и функции находятся в разных пространствах имен в тире, и это также указывается в POSIX :
Кроме того, переменные по умолчанию имеют глобальную область видимости. Некоторые оболочки (например, bash, ksh и zsh) предоставляют
local
ключевое слово для объявления переменных в функции только с локальной областью действия.Итак, да, поведение, которое вы видите, гарантируется POSIX.
POSIX не стандартизированы
local
, пока :(акцент мой)
источник
local
один из наиболее стабильных интерфейсов (по сравнению с сильно сломанным в bash, например), bash только недавно (4.4) заимствовалlocal -
(для локальной области видимости для варианты) из золы (реализация масштабирования в стиле пепла только для этой одной$-
переменной). ksh и yash не имеютlocal
( есть только варианты pdkshlocal
), но имеютtypeset
вместо этого (в ksh93typeset
обеспечивает локальную (статическую) область видимости только в функциях, объявленных с использованием синтаксиса ksh).