Сценарии оболочки обычно обрабатываются так, как если бы они были такими же, как и любые другие исполняемые файлы, такие как двоичные файлы, сценарии Python, сценарии Perl или любые другие типы сценариев. У них есть шебанг наверху, который указывает ядру выполнять их через оболочку. Ожидается, что они будут вызываться так же, как и любая другая команда.
Таким образом, новая оболочка запускается каждый раз, когда вызывается скрипт, и любые параметры, такие как set -f
присутствующие в вызывающей оболочке или в любом другом экземпляре оболочки в системе, не имеют значения.
Конечно, пользователи могут использовать ваш сценарий вместо его запуска, например, так:
. /path/to/your/script
или выполнить его в оболочке, которая имеет нестандартные настройки, например:
sh -f /path/to/your/script
но это не считается нормальным способом или вызовом вашего скрипта, и пользователи, которые делают это, должны ожидать, что они получат в результате.
Обратите внимание, что есть некоторые сценарии, которые предназначены для получения, а не для выполнения, потому что они предназначены для таких вещей, как изменение cwd или установка переменных среды, которые должны отражаться в среде оболочки поиска, но они в меньшинстве и это обычно делается как часть согласованного протокола. Эти файлы можно рассматривать скорее как «плагины» для любой системы, от которой они ожидают, не столько как от независимых скриптов. Например, файлы /etc/rc*.d
с именами, которые заканчиваются на .sh
, получены из подсистемы сценариев запуска, а не выполняются, и задокументировано, что это произойдет, если вы поместите файл с таким именем в/etc/rc*.d
и когда это сделано, это сделано специально. Соглашение о присвоении имен файлам, предназначенным для получения, а не для выполнения таким образом, также применяется в других местах, но не универсально.
Это правда, что файлы, предназначенные для получения таким способом, должны позаботиться о том, какие настройки могут присутствовать в среде их вызывающего, что может повлиять на поведение оболочки, но тогда согласованный протокол в идеале должен обещать предсказуемую среду выполнения.
shell_state=$(set +o)
... скрипт ...eval "$shell_state"