Вы уже знаете о оболочке. Это программа, которая позволяет запускать команды в Linux. Ваше основное взаимодействие с оболочкой – это когда вы запускаете команды в терминале.
Рано или поздно вы встретите термин «subshell», который может вас запутать.
Подоболочка – это в основном новая оболочка, предназначенная только для запуска желаемой программы. Подоболочка может получить доступ к глобальным переменным, установленным «родительской оболочкой», но не к локальным переменным. Любые изменения, внесенные подоболочкой в глобальную переменную, не передаются в родительскую оболочку.
Имеет ли это смысл? Возможно нет. Позвольте мне подробно объяснить вещи на примерах.
Вот однострочный сценарий, который отображает значение переменной ‘var’.
echo $var
Мы установили для этой переменной значение LHB, как вы думаете, что будет отображаться при запуске скрипта?
Сюрприз! Скрипт не видит значение переменной var, которую мы установили ранее.
Почему? Потому что, когда вы запускаете сценарий оболочки, он запускает свою собственную оболочку. Поскольку эта оболочка происходит из другой оболочки (где вы устанавливаете переменную и где запускаете скрипт), она называется подоболочкой.
Сценарий оболочки не мог увидеть значение переменной, потому что это была локальная переменная, и она не была известна только что созданной оболочке. Если вы хотите, чтобы переменная была доступна ее подоболочкам, вам придется использовать команду экспорта и превратить ее в глобальную переменную.
Вы также можете создать подоболочку, запустив новые оболочки из существующих. Просто запустите bash и вы будете в подоболочке. Вы можете использовать команду exit, чтобы закрыть/выйти из оболочки и вернуться к исходной оболочке.
Не думайте о подоболочке как о новом окне терминала. Мы знаем, что это сложно визуализировать, но это так.
Мы использовали переменную, чтобы показать разницу между двумя оболочками (родительской и подоболочкой). В этом случае переменная var не была экспортирована и, следовательно, не была известна подоболочке.
Таким же образом можно создавать и вложенные подоболочки. После экспорта переменной она остается экспортированной во все созданные впоследствии подоболочки.
Вы можете изменить значение экспортируемой переменной в подоболочке. Измененное значение будет передано в последующие подоболочки (поскольку сама переменная является глобальной), но если вы выйдете из нее и вернетесь в исходную оболочку, исходное значение будет сохранено.
Почему? Поскольку значение экспортируемой переменной копируется в подоболочку. И это копия, которая изменена (с LHB на HOC). Исходное значение остается прежним в родительской оболочке.
Так что имейте в виду, что невозможно изменить значение переменной в родительской оболочке из подоболочки. Неважно, экспортируете вы переменную или нет, переменная не будет изменена в родительской оболочке.
Нормальным поведением является то, что сценарий оболочки выполняется в собственной оболочке, т. е. в подоболочке.
Вы можете изменить это поведение и запустить сценарий оболочки в текущей оболочке благодаря встроенной команде оболочки под названием точка (.).
Нет, это не то же самое, что запускать сценарий оболочки вроде этого ./script. Вместо этого вы запускаете его так:
. script
Таким образом, команды из сценария выполняются текущей оболочкой, как если бы они были введены в терминал, а не выполнялись через сценарий в подоболочке. Таким образом скрипты могут получить доступ к локальным переменным.
Мы думаем, что это достаточно хорошая информация о подоболочке в Linux.