Отдельные пространства имен для функций и переменных в оболочках POSIX

Отдельные пространства имен для функций и переменных в оболочках POSIX

В 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) на случай, если этот механизм локальной переменной будет принят в будущей версии этого стандарта.

(выделено мной)

Связанный контент