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

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

function_name () {
    #statements
}

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

function function_name () {
    #statements
}

person Mint    schedule 11.01.2011    source источник


Ответы (3)


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

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

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

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

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

Например, это допустимое определение и вызов функции:

$ myfunc() for arg; do echo "$arg"; done; myfunc foo bar
foo
bar
person SiegeX    schedule 11.01.2011
comment
А как же без скобок? Я видел function myfunc { раньше. - person Aaron Franke; 01.06.2019
comment
@AaronFranke Еще один способ определения функции, хотя я скажу, что этот способ менее широко используется. - person SiegeX; 02.06.2019

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

person Greg Hewgill    schedule 11.01.2011
comment
Ах, хорошо, думаю, это имеет смысл, просто в PHP вы можете помещать что-то в круглые скобки, поэтому мне было любопытно, смогу ли я сделать что-то подобное в сценариях Linux. - person Mint; 11.01.2011
comment
@Mint: вы не можете ничего помещать в круглые скобки, и они не используются при вызове функции, но вы все равно можете передавать в функцию позиционные параметры. foo () { echo "$1"; }; foo hello - person Dennis Williamson; 11.01.2011

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

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
person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 10.07.2015
comment
Это не особенность ключевого слова function — это просто псевдонимы, работающие так, как они всегда делают, выполняя текстовую замену на первом слове в строке в одиночку. Если бы кто-то создал псевдоним с именем function, он все равно был бы раскрыт здесь. - person Charles Duffy; 20.02.2020