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