Переменные и функции находятся в разных пространствах имен в тире, и это также указывается в POSIX :
Реализация должна поддерживать отдельные пространства имен для функций и переменных.
Кроме того, переменные по умолчанию имеют глобальную область видимости. Некоторые оболочки (например, bash, ksh и zsh) предоставляют local
ключевое слово для объявления переменных в функции только с локальной областью действия.
Итак, да, поведение, которое вы видите, гарантируется POSIX.
POSIX не стандартизированы local
, пока :
Описание функций в раннем предложении основывалось на том, что функции должны вести себя как миниатюрные сценарии оболочки; то есть, за исключением общих переменных , большинство элементов среды исполнения должны вести себя так, как если бы они были новой средой исполнения, [..]
[..] Локальные переменные внутри функции были рассмотрены и включены в другое раннее предложение (контролируемое специальной встроенной функцией local
), но были удалены, потому что они не соответствуют простой модели, разработанной для функций, и потому что было некоторое возражение против добавления еще другая новая специальная встроенная, которая не была частью исторической практики. Реализации должны зарезервировать идентификатор local
(а также typeset
, как он используется в KornShell) на случай, если этот механизм локальных переменных будет принят в будущей версии этого стандарта.
(акцент мой)
fn
функция находится в отдельном пространстве имен; если бы его выполнение однажды стерло его определение, мы бы увидели точно такое же поведение. Вы должны показать, что функция все еще определена, например, сtype fn
после.