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