Без этого ()
синтаксис действительно был бы неоднозначным.
Должен быть некоторый однозначный синтаксис для определения функции, и без существенного изменения другого синтаксиса оболочки это не может быть следующим:
do_something {
# one or more commands go here
}
Вы сказали, что это «не противоречит текущему синтаксису», но это так! Обратите внимание, что вы не получите никакой синтаксической ошибки при попытке запустить первую строку этого . Вы получаете ошибку, но это не ошибка синтаксиса. Вторая строка, с }
, является синтаксической ошибкой, но первая строка - нет. Вместо этого do_something {
пытается выполнить команду, которая называется, do_something
и передать {
в качестве аргумента эту команду:
$ do_something {
do_something: command not found
Если команда уже вызвана do_something
, вы ее запускаете. Если функция уже вызвана do_something
, вы вызываете ее . В целом важно, чтобы синтаксис был однозначным, но также важно, чтобы было возможно переопределить функцию, не вызывая ее случайно. Определение функции и ее вызов не должны выглядеть одинаково.
Как оболочка лечит {
и (
.
Как type {
скажет вам, {
это ключевое слово оболочки. Это делает это как [[
. Если используется в ситуации, когда в противном случае это была бы команда, {
несет особую семантику. В частности, он выполняет группирование команд. В других ситуациях, однако, он может использоваться без экранирования для обозначения буквального {
символа. Это включает в себя ситуацию передачи его в качестве второго или последующего слова команды.
Конечно, Bash мог быть разработан так, чтобы относиться {
иначе, чем в настоящее время. Однако его синтаксис больше не был бы совместим с оболочкой POSIX, и Bash на самом деле не был бы оболочкой в стиле Борна и не мог бы выполнять много сценариев оболочки.
Напротив, (
это метасимвол оболочки. Он всегда относился особенно , если он появляется в команде и не котируется (с '
'
, "
"
или \
). Таким образом, в синтаксисе нет двусмысленности:
do_something() {
# one or more commands go here
}
Это не может означать ничего другого. Если у Bash нет функций, это будет синтаксическая ошибка, по той же причине echo foo(bar)
синтаксическая ошибка.
Если вам действительно не нравится ()
запись, вы можете использовать ключевое слово function
и опустить его, как упоминает sudodus . Обратите внимание, что это не является частью синтаксиса для определения функций в большинстве других оболочек в стиле Борна - и в некоторых он поддерживается, но функции, определенные таким образом, имеют различную семантику - и поэтому сценарий, который его использует, не будет переносимым. (Причина, по которой этот синтаксис может быть однозначным, заключается в том, что function
оно само по себе является ключевым словом в Bash, которое означает, что все, что следует за ним, является началом определения функции.)
Наконец, обратите внимание, что хотя большинство определений функций используют {
на практике, любая составная команда разрешена. Если у вас есть функция, тело которой вы хотите всегда выполнять в подоболочке, вы можете использовать (
)
вместо {
}
.