2015-11-16 4 views
1

Недавно во время работы я заметил это поведение локальных переменных. Я написал этот фрагмент кода, чтобы упростить мои сомнения.Локальная переменная функции вызова доступна в вызываемой функции

foo() { 
    echo "This is moo : $MOO_VAR" 
} 

moo() { 
    local MOO_VAR="Hi MOO!" 
    foo 
} 

echo "calling moo." 
moo 

Я не могу понять, как функция foo может получить доступ к значению локальной переменной MOO_VAR функции moo, хотя foo не может изменить значение MOO_VAR. Я не могу найти объяснения этого поведения. Может кто-нибудь объяснить, почему это происходит?

ответ

2

Это documented Поведение bash. Казалось бы, локальный действительно просто означает, восстановить эту переменную до своего предыдущего состояния в конце функции. Из-за того, как переменные реализуются в bash (хранятся в глобальном пространстве имен), это означает, что переменные не могут быть скрыты от дочерних элементов, не сначала отключая переменную перед каждым вызовом функции, а затем восстанавливая ее впоследствии.

+1

Но вы можете определить переменную 'local' в' foo' с тем же именем, ее значение будет восстановлено в конце функции. – choroba

+0

Да, я это знаю. Но почему локальная переменная 'moo' доступна для' foo'. Разве не должен быть объем 'MOO_VAR' внутри' moo'. – molecule

+0

Dunes, поэтому, если я изменю значение 'MOO_VAR' внутри' foo', оно изменит его значение, поскольку оно будет храниться в глобальном пространстве имен, и когда функция завершится, он просто повторно инициализирует его до своего первоначального значения, чтобы его использование в 'moo' остается незатронутым? – molecule

Смежные вопросы