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