Функции оболочки Korn
Зарезервированное слово function предназначено для определения функций оболочки. Оболочка считывает определение функции и сохраняет его в текущей среде. При разборе определений функций разворачиваются псевдонимы. Оболочка выполняет функции точно так же, как команды, и передает в них аргументы как позиционные параметры.
Оболочка Korn (POSIX) выполняет функции в среде, из которой они вызываются. Следующие объекты являются общими для функции и сценария, из которого она вызвана, и их изменение приводит к побочным эффектам:
- Атрибуты и значения переменных (если для объявления локальной переменной внутри функции не применяется команда typeset)
- Рабочий каталог
- Псевдонимы, определения функций и атрибуты
- Особый параметр
$ - Открытые файлы
Следующие объекты функции не связаны с соответствующими объектами сценария, из которого была вызвана функция, и их изменение не приводит к побочным эффектам:
- Позиционные параметры
- Особый параметр
# - Переменные в списке значений переменных, заданном при вызове функции
- Переменные, объявленные с помощью команды typeset внутри функции
- Опции
- Прерывания. (Учтите, что сигналы, игнорируемые сценарием, всегда игнорируются и вызываемыми из него функциями).
Если прерывание 0 или EXIT сработает внутри тела функции, то соответствующее действие будет выполнено после завершения функции в среде, из которой она была вызвана. Если прерывание сработает вне тела функции, соответствующее действие будет выполнено после выхода из оболочки Korn. В ранних версиях оболочки Korn прерывания 0 и EXIT, сработавшие вне тела функции, не выполнялись после завершения работы оболочки.
При выполнении функции действуют все правила присвоения переменных и обработки синтаксических ошибок, описанные во встроенных командах оболочки Korn или оболочки POSIX.
Если имя функции будет указано в
качестве простой команды, то фактически будет выполнена
составная команда. Операнды этой простой команды на время
выполнения составной команды станут ее позиционными параметрами. Кроме того, значение особого параметра
# будет изменено в соответствии с числом операндов. Особый параметр 0 остается без изменения.
Для возврата управления из тела функции применяется особая команда return. Кроме того, управление автоматически возвращается в вызывающий сценарий в случае ошибки в теле функции.
Список определенных функций можно просмотреть с помощью команды typeset с флагом -f или +f. Если будет указана опция -f, то помимо имен будет показан текст функций. Для того чтобы аннулировать определение функции, нужно выполнить особую команду unset с флагом -f.
По умолчанию определения функций аннулируются при выполнении сценариев оболочки. Флаг -xf особой команды typeset позволяет экспортировать функции в сценарии, выполняемые в текущем экземпляре оболочки. Если какая-либо функция должна действовать в различных экземплярах оболочки, ее определение нужно указать в файле ENV с опцией -xf команды typeset.
При разборе определения функции код завершения 0 устанавливается в случае, если оболочке не удалось объявить функцию. В противном случае код завершения будет больше нуля. Код завершения функции равен коду завершения последней выполненной в ней команды.