Я прочитал здесь, что цель export
оболочки - сделать переменную доступной для подпроцессов, запускаемых из оболочки.
Однако я также читал здесь и здесь, что «Процессы наследуют свое окружение от своего родителя (процесс, который их запустил)».
Если это так, зачем нам это нужно export
? Чего мне не хватает?
Переменные оболочки не являются частью среды по умолчанию? В чем разница?
источник
set -k
Это так, что можно использоватьcmd ENVVAR=value
вместоENVVAR=value cmd
, это не будет работать в вашем примере, если неset -k
было выполнено до вызоваf
. Кроме того, не многие оболочки поддерживают его в настоящее время и только для обратной совместимости с оболочкой Bourne. В оболочке Bourne (или Korn) это не сработало бы для функций. И поскольку он влияет на синтаксический анализ оболочки, он должен действовать, когда оболочка читает код, который использует его там.set -a
Существует разница между переменными оболочки и переменными среды. Если вы определяете переменную оболочки без
export
ее использования, она не добавляется в среду процессов и, следовательно, не наследуется ее дочерним элементам.Используя это,
export
вы говорите оболочке добавить переменную оболочки в среду. Вы можете проверить это с помощьюprintenv
(который просто печатает свое окружениеstdout
, поскольку это дочерний процесс, в котором вы видите влияниеexport
переменных):источник
Переменная, однажды экспортированная, является частью среды.
PATH
экспортируется в самой оболочке, а пользовательские переменные могут быть экспортированы по мере необходимости. Используя некоторый установочный код:сравнить
С участием
Поскольку
foo
оболочкаtest2.sh
не экспортируется и никогда не экспортируется, она не была частью средыsubshell.sh
последнего запуска.источник