Для чего используются скобки в определении функции сценария оболочки bash, например "f () {}"? Это отличается от использования ключевого слова «функция»? - PullRequest
35 голосов
/ 11 января 2011

Мне всегда было интересно, для чего они используются?Кажется глупым помещать их в каждый раз, если вы никогда не можете поместить в них что-либо.

function_name () {
    #statements
}

Также есть что-то, что можно выиграть / проиграть, если поставить ключевое слово function в начале функции?*

function function_name () {
    #statements
}

Ответы [ 3 ]

46 голосов
/ 11 января 2011

Ключевое слово function устарело в пользу function_name() для переносимости со спецификацией POSIX

Функция является пользовательскойопределенное имя, которое используется как простая команда для вызова составной команды с новыми позиционными параметрами.Функция определяется с помощью «команды определения функции».

Формат команды определения функции следующий:

fname() compound-command[io-redirect ...]

Обратите внимание, что { } не является обязательнымтак что если вы не собираетесь использовать ключевое слово function (и не должны), тогда () необходимы, чтобы анализатор знал, что вы определяете функцию.

Пример, этоопределение и вызов юридической функции:

$ myfunc() for arg; do echo "$arg"; done; myfunc foo bar
foo
bar
10 голосов
/ 11 января 2011

Пустые скобки требуются в вашем первом примере, чтобы bash знал, что это определение функции (в противном случае это выглядит как обычная команда)Во втором примере () является необязательным, потому что вы использовали function.

4 голосов

Без function расширение псевдонима происходит во время определения . E.g.:

alias a=b
# Gets expanded to "b() { echo c; }" :
a() { echo c; }
b
# => c
# Gets expanded to b:
a
# => c

Однако с function расширение псевдонима не происходит во время определения, поэтому псевдоним "скрывает" определение:

alias a=b
function a { echo c; }
b
# => command not found
# Gets expanded to b:
a
# => command not found
unalias a
a
# => c
...