Обычно функции bash определяются с помощью фигурных скобок, чтобы заключить тело:
foo()
{
...
}
При работе с оболочкой script сегодня, когда мы широко используем функции, я столкнулся с проблемами с переменными, которые имеют одно и то же имя в вызываемом как в вызывающей функции, а именно, что эти переменные одинаковы. Я узнал, что это можно предотвратить, указав локальные переменные внутри функции как локальные: local var=xyz
.
Затем в какой-то момент я обнаружил поток (Определение тела функции bash с использованием скобок вместо скобок), в котором объясняется, что он просто как действительный для определения функции с помощью круглых скобок, таких как:
foo()
(
...
)
Эффект от этого заключается в том, что тело функции выполняется в подоболочке, что имеет преимущество, что функция имеет свой собственный диапазон переменных, что позволяет мне определять их без локального. Поскольку наличие функционально-локальной области видимости имеет гораздо больший смысл и намного безопаснее, чем все глобальные переменные, я сразу же спрашиваю себя:
- Почему скобки, используемые по умолчанию, заключают тело функции вместо круглых скобок?
Тем не менее, я быстро также обнаружил существенный недостаток в выполнении функции в подоболочке, в частности, что выход из script изнутри функции больше не работает, вместо этого заставляя меня работать со статусом возврата по всему вызову tree (в случае вложенных функций). Это приводит меня к следующему вопросу:
- Существуют ли другие основные недостатки (*) для использования скобок вместо скобок (что может объяснить, почему фигурные скобки кажутся предпочтительными)?
(*) Я знаю (из обсуждений, связанных с исключениями, с которыми я наткнулся со временем), что некоторые утверждают, что явно использование статуса ошибки намного лучше, чем возможность выхода из любого места, но я предпочитаю последнее.
По-видимому, оба стиля имеют свои преимущества и недостатки. Поэтому я надеюсь, что некоторые из вас более опытные пользователи bash могут дать мне общее руководство:
- Когда я должен использовать фигурные скобки, чтобы заключить тело функции, и когда целесообразно переключиться на круглые скобки?
РЕДАКТИРОВАТЬ: Принимать ответы из ответов
Спасибо за ваши ответы, теперь моя голова немного понятна. Так что я отнимаю ответы:
-
Придерживайтесь обычных фигурных скобок, хотя бы для того, чтобы не путать потенциальных других пользователей/разработчиков script (и даже использовать фигурные скобки, если все тело завернуто в круглые скобки).
-
Единственным реальным недостатком фигурных скобок является то, что любая переменная в родительской области может быть изменена, хотя в некоторых ситуациях это может быть преимуществом. Это можно легко обойти, объявив переменные как
local
. -
С помощью круглых скобок, с другой стороны, могут возникнуть серьезные нежелательные эффекты, такие как испорчивание выходов, приводящие к проблемам с убийством script и выделение области переменных.