Каково ключевое слово '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.