Po przeczytaniu 24.2. Zmienne lokalne , pomyślałem, że zadeklarowanie zmiennej var
ze słowem kluczowym local
oznacza, że var
wartość jest dostępna tylko w bloku kodu ograniczonym nawiasami klamrowymi funkcji.
Jednak po uruchomieniu następujący przykład, okazało się, że var
można również uzyskać, odczytywane i zapisywane z funkcji powołuje tego bloku kodu - czyli choć var
deklaruje local
się outerFunc
, innerFunc
nadal jest w stanie go odczytać i zmienić jego wartość.
#!/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}]"
Wydajność:
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:]
P: Czy to błąd w mojej powłoce (bash 4.3.42, Ubuntu 16.04, 64bit), czy jest to oczekiwane zachowanie?
EDYCJA: rozwiązana. Jak zauważył @MarkPlotnick, jest to rzeczywiście oczekiwane zachowanie.
var
jest pusta? var
jest ustawiony globalnie innerFunc
, więc dlaczego nie przykleja się do końca skryptu?