Было сказано, что нет необходимости экспортировать в bash, когда нерестуют подоболочки, в то время как другие говорят прямо противоположное. Важно отметить разницу между подоболочками (те, которые созданы ()
, ``
, $()
или циклы) и подпроцессы (процессы, вызываемые по имени, например, литерал bash
, отображаемый в вашем скрипте ). Подседки будут иметь доступ ко всем переменным от родителя, независимо от их экспортируемого состояния. С другой стороны, подпроцессы будут видеть только экспортированные переменные. Что общего в этих двух конструктах, так это то, что ни одна из них не может передавать переменные обратно в родительскую оболочку.
$ noexport=noexport; export export=export; (echo subshell: $noexport $export; subshell=subshell); bash -c 'echo subprocess: $noexport $export; subprocess=subprocess'; echo parent: $subshell $subprocess
subshell: noexport export
subprocess: export
parent:
Есть еще один источник путаницы: некоторые считают, что подпроцессы «раздвоенные» - это те, t неэкспортируемые переменные. Обычно fork () s сразу следует за exec () s, и поэтому кажется, что fork () - это то, что нужно искать, в то время как на самом деле это exec (). Вы можете запускать команды без fork () сначала с помощью команды exec
, и процессы, запущенные этим методом, также не будут иметь доступа к невыгруженным переменным:
$ noexport=noexport; export export=export; exec bash -c 'echo execd process: $noexport $export; execd=execd'; echo parent: $execd
execd process: export
Обратите внимание, что мы не видим parent:
на этот раз, потому что мы заменили родительскую оболочку командой exec
, поэтому для выполнения этой команды ничего не осталось.