Функции оболочки Korn

Зарезервированное слово function предназначено для определения функций оболочки. Оболочка считывает определение функции и сохраняет его в текущей среде. При разборе определений функций разворачиваются псевдонимы. Оболочка выполняет функции точно так же, как команды, и передает в них аргументы как позиционные параметры.

Оболочка Korn (POSIX) выполняет функции в среде, из которой они вызываются. Следующие объекты являются общими для функции и сценария, из которого она вызвана, и их изменение приводит к побочным эффектам:

  • Атрибуты и значения переменных (если для объявления локальной переменной внутри функции не применяется команда typeset)
  • Рабочий каталог
  • Псевдонимы, определения функций и атрибуты
  • Особый параметр $
  • Открытые файлы

Следующие объекты функции не связаны с соответствующими объектами сценария, из которого была вызвана функция, и их изменение не приводит к побочным эффектам:

  • Позиционные параметры
  • Особый параметр #
  • Переменные в списке значений переменных, заданном при вызове функции
  • Переменные, объявленные с помощью команды typeset внутри функции
  • Опции
  • Прерывания. (Учтите, что сигналы, игнорируемые сценарием, всегда игнорируются и вызываемыми из него функциями).
Прим.: В ранних версиях оболочки Korn все прерывания, за исключением EXIT и ERR, были общими для функции и сценария, из которого она была вызвана.

Если прерывание 0 или EXIT сработает внутри тела функции, то соответствующее действие будет выполнено после завершения функции в среде, из которой она была вызвана. Если прерывание сработает вне тела функции, соответствующее действие будет выполнено после выхода из оболочки Korn. В ранних версиях оболочки Korn прерывания 0 и EXIT, сработавшие вне тела функции, не выполнялись после завершения работы оболочки.

При выполнении функции действуют все правила присвоения переменных и обработки синтаксических ошибок, описанные во встроенных командах оболочки Korn или оболочки POSIX.

Если имя функции будет указано в качестве простой команды, то фактически будет выполнена составная команда. Операнды этой простой команды на время выполнения составной команды станут ее позиционными параметрами. Кроме того, значение особого параметра # будет изменено в соответствии с числом операндов. Особый параметр 0 остается без изменения.

Для возврата управления из тела функции применяется особая команда return. Кроме того, управление автоматически возвращается в вызывающий сценарий в случае ошибки в теле функции.

Список определенных функций можно просмотреть с помощью команды typeset с флагом -f или +f. Если будет указана опция -f, то помимо имен будет показан текст функций. Для того чтобы аннулировать определение функции, нужно выполнить особую команду unset с флагом -f.

По умолчанию определения функций аннулируются при выполнении сценариев оболочки. Флаг -xf особой команды typeset позволяет экспортировать функции в сценарии, выполняемые в текущем экземпляре оболочки. Если какая-либо функция должна действовать в различных экземплярах оболочки, ее определение нужно указать в файле ENV с опцией -xf команды typeset.

При разборе определения функции код завершения 0 устанавливается в случае, если оболочке не удалось объявить функцию. В противном случае код завершения будет больше нуля. Код завершения функции равен коду завершения последней выполненной в ней команды.