Вот что происходит, когда команда выполняется в среде подоболочки:
Команда будет запущена в копии текущей среды выполнения оболочки.
"Назначения переменных и встроенные команды, которые влияют на среду оболочки, не остаются в силе после завершения команды" (цитата)
Пример:
#!/bin/sh
export TOTO=123
FOO=abc
(mycmd)
В этом случае mycmd сможет читать TOTO, но не FOO, и каждое изменение значений этих двух переменных, реализованное mycmd, не будет видно в текущей оболочке.
Но что происходит, когда мы делаем то же самое с функцией?
Пример:
#!/bin/sh
export TOTO=123
FOO=abc
function (){
echo $TOTO
echo $FOO
TOTO=${TOTO}456
FOO=${FOO}def
}
(function)
echo $TOTO
echo $FOO
результат:
123
abc
123
abc
Вполне разумно, что функция, выполняемая в подоболочке, не может изменять содержимое переменных, определенных в родительской оболочке, с другой стороны, она может читать все переменные без разбора, даже если они не экспортируются.
Может кто-нибудь объяснить это поведение лучше? Ссылки на некоторые ссылки будут очень признательны, так как я ничего не мог найти об этом.
TOTO
иFOO
, которые являются областью действия функции, и если выполняется в этом подоболочка, не должны влиять на существующие значенияTOTO
иFOO
, объявленные в основной части скрипта. Даже при отсутствии повторного объявления тот же результат будет применяться из-за того, что подоболочка наследует среду родителя. - person David C. Rankin   schedule 21.11.2015return
целочисленное значение). - person David C. Rankin   schedule 21.11.2015echo $$ $BASHPID
с(echo $$ $BASHPID)
в bash 4 или более поздних версиях. - person chepner   schedule 21.11.2015