Создание вложенной оболочки включает fork()
, поэтому она определенно имеет издержки по сравнению с локальной переменной.Хотя вложенные оболочки дешевы - вам не нужно беспокоиться об их стоимости, когда они вам нужны - они не бесплатны.
Если ваш сценарий будет интенсивно использоваться и производительность действительно имеет значение (так что у вас будетсотни пользователей запускают его одновременно, много раз в день), тогда вы можете беспокоиться о производительности суб-оболочки.OTOH, если вы запускаете его раз в месяц, а сценарий в целом выполняется менее чем за 10 секунд, вы, вероятно, этого не сделаете.
Однако, с точки зрения ясности, гораздо лучше быть явным и объявитьпеременные - это снижает риск взлома скрипта, потому что кто-то приходит и говорит, что «эта вложенная оболочка явно не нужна» (а на самом деле это не так; я бы хотел удалить вложенные оболочки из ваших функций).
Посмотрите на развитие сценариев Perl.Они начинались как общедоступные с переменными, появляющимися по требованию.Постепенно они стали более строгими, и теперь в обычном стиле предопределяются все переменные.В некоторой степени оболочки следуют по тому же пути - но не так строго, как Perl.Awk также интересный пример;его функции используют глобальные переменные, если они не являются аргументами для функции, что приводит к тому, что функции пишутся с 3 активными аргументами (скажем) и 5 неактивными аргументами, которые эффективно определяют локальные переменные.Это немного эксцентрично, хотя и «работает».