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

В тире функции и переменные, похоже, живут в отдельных пространствах имен:

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 

Является ли эта особенность тире или гарантией POSIX?

2 Solutions collect form web for “Отдельные пространства имен для функций и переменных в оболочках POSIX”

Гарантия :

2.9.5 Команда определения функции

Функция – это определяемое пользователем имя, которое используется как простая команда для вызова составной команды с новыми позиционными параметрами. Функция определяется с помощью команды определения функции. […]

Функция называется fname; приложение должно гарантировать, что это имя (см. XBD Name) и что это не имя специальной встроенной утилиты. Реализация может допускать использование других символов в имени функции в качестве расширения. Реализация должна поддерживать отдельные пространства имен для функций и переменных.

Переменные и функции находятся в разных пространствах имен в тире, и это также указывается POSIX :

Реализация должна поддерживать отдельные пространства имен для функций и переменных.

Кроме того, по умолчанию переменные имеют глобальную область видимости. Некоторые оболочки (например, bash, ksh и zsh) предоставляют local ключевое слово для объявления переменных в функции только с локальной областью.

Итак, да, поведение, которое вы видите, гарантируется POSIX.

POSIX не стандартизирует локальные, но :

Описание функций в раннем предложении основывалось на понятии, что функции должны вести себя как миниатюрные сценарии оболочки; то есть, за исключением обмена переменными , большинство элементов среды выполнения должны вести себя так, как если бы они были новой средой исполнения, [..]

[..] Локальные переменные внутри функции были рассмотрены и включены в другое раннее предложение (контролируемое специальным встроенным локальным), но были удалены, поскольку они не соответствуют простой модели, разработанной для функций, и потому что есть некоторая оппозиция добавлению еще одна новая специальная встроенная программа, которая не была частью исторической практики. Реализации должны резервировать локальный идентификатор (а также набор символов, используемый в KornShell), если этот механизм локальной переменной принят в будущей версии этого стандарта.

(акцент мой)

  • Получить номер строки в сценарии оболочки Bourne
  • Как работает эта функция bash?
  • Могу ли я отслеживать тире скрипта без изменения его исходного кода?
  • Когда sh является символической ссылкой на bash или тире, bash ограничивает себя соблюдением POSIX, поэтому он должен быть на 100% совместим с sh?
  • Ошибка перенаправления Dash exec
  • Что происходит, когда скрипт встречает ошибку в одной из команд?
  • Обработка опций Getopts, возможно ли добавить не переносимый ?
  • Вызов скрипта с sudo игнорирует shebang
  • Избегайте расширения обратной косой черты с эхом в тире
  • Получение истинного абсолютного пути сценария в / bin / sh
  • В сценарии проверьте, не поступает ли стандартный ввод из файла или канала
  • Linux и Unix - лучшая ОС в мире.