Каково ключевое слово 'function', используемое в некоторых сценариях bash?
Например:
Bash-Prog-Intro-HOWTO
function foo() {}
Я делаю поисковые запросы в info bash
и смотрю в releted главы POSIX для функции, но ничего не найдено.
Что такое function
ключевое слово, используемое в некоторых скриптах bash? Это какой-то устаревший синтаксис?
Ответы
Ответ 1
Ключевое слово function
является необязательным при определении функции в Bash, как описано в manual:
Функции объявляются с использованием этого синтаксиса:
name () compound-command [ redirections ]
или
function name [()] compound-command [ redirections ]
Первая форма синтаксиса обычно предпочтительнее, потому что она совместима с сценариями Bourne/Korn/POSIX и поэтому более переносима.
При этом иногда вам может понадобиться использовать ключевое слово function
, чтобы предотвратить Bash aliases от столкновения с вашим именем функции. Рассмотрим этот пример:
$ alias foo="echo hi"
$ foo() { :; }
bash: syntax error near unexpected token `('
Здесь 'foo'
заменяется текстом псевдонима с тем же именем, потому что это первое слово команды. С function
псевдоним не расширяется:
$ function foo() { :; }
Ответ 2
Ключевое слово function
необходимо в редких случаях, когда имя функции также является псевдонимом. Без него Bash расширяет псевдоним до разбора определения функции - вероятно, не то, что вы хотите:
alias mycd=cd
mycd() { cd; ls; } # Alias expansion turns this into cd() { cd; ls; }
mycd # Fails. bash: mycd: command not found
cd # Uh oh, infinite recursion.
С ключевым словом function
все работает по назначению:
alias mycd=cd
function mycd() { cd; ls; } # Defines a function named mycd, as expected.
cd # OK, goes to $HOME.
mycd # OK, goes to $HOME.
\mycd # OK, goes to $HOME, lists directory contents.
Ответ 3
Зарезервированное слово function
является необязательным. См. Раздел "Определения функций оболочки" на странице bash.