В 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
Это специфическая функция Dash или гарантия POSIX?
решение1
2.9.5 Команда определения функции
Функция — это определяемое пользователем имя, которое используется как простая команда для вызова составной команды с новыми позиционными параметрами. Функция определяется с помощью «команды определения функции».[...]
Функция называется fname; приложение должно гарантировать, что это имя (см. Имя XBD) и что это не имя специальной встроенной утилиты. Реализация может допускать другие символы в имени функции в качестве расширения.Реализация должна поддерживать отдельные пространства имен для функций и переменных.
решение2
Переменные и функции находятся в разных пространствах имен в dash, и это также указаноPOSIX:
Реализация должна поддерживать отдельные пространства имен для функций и переменных.
В дополнение к этому, переменные имеют глобальную область видимости по умолчанию. Некоторые оболочки (например, bash, ksh и zsh) предоставляют local
ключевое слово для объявления переменных в функции только с локальной областью видимости.
Итак, да, поведение, которое вы видите, гарантируется POSIX.
POSIX не имеетстандартизированный local
,еще:
Описание функций в раннем предложении основывалось на идее, что функции должны вести себя как миниатюрные скрипты оболочки, то есть:за исключением совместного использования переменныхбольшинство элементов среды выполнения должны вести себя так, как если бы они были новой средой выполнения, [..]
[..] Локальные переменные внутри функции были рассмотрены и включены в другое раннее предложение (контролируемое специальным встроенным
local
), нобыли удаленыпоскольку они не соответствуют простой модели, разработанной для функций, и поскольку было некоторое противодействие добавлению еще одной новой специальной встроенной функции, которая не была частью исторической практики. Реализации должны зарезервировать идентификаторlocal
(а такжеtypeset
, как используется в KornShell) на случай, если этот механизм локальной переменной будет принят в будущей версии этого стандарта.
(выделено мной)