Без этого ()синтаксис действительно был бы неоднозначным.
Должен быть некоторый однозначный синтаксис для определения функции, и без существенного изменения другого синтаксиса оболочки это не может быть следующим:
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, которое означает, что все, что следует за ним, является началом определения функции.)
Наконец, обратите внимание, что хотя большинство определений функций используют {на практике, любая составная команда разрешена. Если у вас есть функция, тело которой вы хотите всегда выполнять в подоболочке, вы можете использовать ( )вместо { }.