Обычно функция Баша определяется с помощью фигурных скобок, чтобы заключить тело:Баш функции: Вшито тело в фигурных скобках против скобки
foo()
{
...
}
При работе над сценарием оболочки сегодня широко использует функцию, I» мы сталкиваемся с проблемами с переменными, которые имеют одно и то же имя в вызываемом как в вызывающей функции, а именно, что эти переменные одинаковы. Я узнал, что это можно предотвратить, указав локальные переменные внутри функции как локальные: local var=xyz
.
Затем, в какой-то момент, я обнаружил нить (Defining bash function body using parenthesis instead of braces), в котором он объяснил, что это так же, как действует определить функцию с помощью круглых скобок, как это:
foo()
(
...
)
Эффект этого является что тело функции выполняется в подоболочке, что имеет преимущество, что функция имеет свой собственный диапазон переменных, что позволяет мне определять их без локального. Так как имеющая функцию локальной области, кажется, гораздо больше смысла и гораздо безопаснее, чем все переменные быть глобальным, я сразу спрашиваю себя:
- Почему фигурные скобки, используемые по умолчанию, чтобы приложить тело функции вместо скобок ?
Однако, я быстро обнаружил также главный недостаток для выполнения функции в субоболочке, в частности, что выход из сценария внутри функции больше не работает, а не заставляет меня работать с возвращаемым вдоль целое дерево вызовов (в случае вложенных функций). Это приводит меня к этому прослеживания вопрос:
- Существуют ли другие основные недостатки (*) для использования круглых скобок вместо фигурных скобок (что может объяснить, почему брекеты, кажется, предпочтительнее)?
(*) Я знаю (из исключений, связанных с обсуждения, я наткнулся в течение долгого времени), что некоторые утверждают, что в явном виде, используя статус ошибки гораздо лучше, чем быть в состоянии выйти из любой точки мира, но я предпочитаю последнее.
Очевидно, что оба стиля имеют свои преимущества и недостатки. Так что я надеюсь, что некоторые из вас более опытные пользователи Баш могут дать мне некоторые общие рекомендации:
- Когда я должен использовать фигурные скобки, чтобы приложить тело функции, и, когда это целесообразно, чтобы переключиться в круглые скобки?
EDIT: Take Визитки из ответов
Спасибо за ваши ответы, моя голова теперь немного яснее в отношении к этому. Так что я забираю из ответов:
Придерживайтесь обычных фигурные скобки, если только для того, чтобы не запутать потенциальных других пользователей/разработчиков сценария (и даже использовать фигурные скобки, если все тело завернутый в круглые скобки).
Единственный реальный недостаток фигурных скобок заключается в том, что любая переменная в родительской области может быть изменена, хотя в некоторых ситуациях это может быть преимуществом. Это можно легко обойти, объявив переменные как
local
.Использование скобок, с другой стороны, может иметь некоторые серьезные нежелательные эффекты, такие как перехватывание выходов, что приводит к проблемам с убийством сценария и изоляции области переменных.
Ваше редактирование - очень хорошая упаковка! – fedorqui