Прочитавши 24.2. Локальні змінні , я вважав, що оголошення змінної varза допомогою ключового слова localозначає, що varзначення доступне лише в блоці коду, обмеженому фігурними дужками функції.
Однак після запуску наступного прикладу, я виявив, що varтакож може бути доступна, і зчитуватися з функцій , що викликаються цього блоком коду - тобто , навіть якщо varдекларуються localдо outerFunc, innerFuncвсе ще в змозі прочитати і змінити його значення.
#!/usr/bin/env bash
function innerFunc() {
var='new value'
echo "innerFunc: [var:${var}]"
}
function outerFunc() {
local var='initial value'
echo "outerFunc: before innerFunc: [var:${var}]"
innerFunc
echo "outerFunc: after innerFunc: [var:${var}]"
}
echo "global: before outerFunc: [var:${var}]"
outerFunc
echo "global: after outerFunc: [var:${var}]"
Вихід:
global: before outerFunc: [var:] # as expected, `var` is not accessible outside of `outerFunc`
outerFunc: before innerFunc: [var:initial value]
innerFunc: [var:new value] # `innerFunc` has access to `var` ??
outerFunc: after innerFunc: [var:new value] # the modification of `var` by `innerFunc` is visible to `outerFunc` ??
global: after outerFunc: [var:]
Q: Це помилка в моїй оболонці (bash 4.3.42, Ubuntu 16.04, 64bit) чи це очікувана поведінка?
EDIT: Вирішено. Як зазначає @MarkPlotnick, це дійсно очікувана поведінка.
varпорожнього? varвстановлюється в усьому світі innerFunc, тож чому він не дотримується до кінця сценарію?