Выполняются ли функции bash в текущей оболочке или подоболочке?

Итак, с какой целью разрешено произвольное имя в форме env var=value и разрешено ли это POSIX?

Цитирую по POSIX: Environment Variables:

Имена переменных среды, используемые утилитами в томе Shell and Utilities документа POSIX.1-2008, состоят исключительно из заглавных букв, цифр и символа ('_' ) из символов, определенных в Portable Character Set, и не начинаются с цифры. Другие символы могут быть разрешены реализацией; приложения должны допускать присутствие таких имен.

Примечание: Другие приложения могут испытывать трудности при работе с именами переменных окружения, начинающимися с цифры. По этой причине использование таких имен нигде не рекомендуется.

Таким образом, реализации env могут разрешать произвольные имена переменных окружения - и большинство, если не все, реализации делают это, принимая каждый символ не NUL слева от '=' - а реализации других утилит (таких как shell) могут разрешать или не разрешать произвольные имена.

Утверждение, что name=value ... utility эквивалентно env var="value" utility, будет верным только в том случае, если реализация env и shell разрешают name быть переменной окружения.

Интересная тема в Austin Group по этому вопросу находится здесь: Неверные назначения оболочки в окружении. В ней упоминается, что оболочки обычно разрешают использовать только те переменные окружения, имена которых могут быть представлены как переменные оболочки. Несколько участников этой темы участвуют в unix.stackexchange.com и, надеюсь, смогут добавить еще немного информации по этому вопросу.

3
02.05.2018, 07:39
1 ответ

Да, вызываемая вами функция выполняется в текущей оболочке.
Это предполагает, что функция была импортирована (, определена )в текущей оболочке. Это можно было бы сделать, найдя какой-нибудь файл (, например ~/.bashrc ), или написав функцию в текущей оболочке вручную. Вы можете подтвердить это предположение, выполнив:

$ type -a change_path

Если это напечатает определение функции, функция была определена в текущей оболочке и, имея доступ к текущим переменным оболочки, может изменить любую из них.

Это не означает, что функция всегда будет изменять переменные, если функция правильно ограничена, например, используя (...)вместо{...}:

$ change_path()(
    export PATH="foobar:$PATH";
)

Но на самом деле эта функция все еще работает в текущей оболочке, просто она запускает под-оболочку(...)

Для подтверждения прочтите это из руководства bash (Акцент мой):

FUNCTIONS
A shell function, defined as described above under SHELL GRAMMAR, stores a series of commands for later execution. When the name of a shell function is used as a simple command name, the list of commands associated with that function name is executed. Functions are executed in the context of the current shell; no new process is created to interpret them (contrast this with the execution of a shell script).

5
27.01.2020, 21:15

Теги

Похожие вопросы