W myślniku funkcje i zmienne wydają się żyć w oddzielnych przestrzeniach nazw:
fn(){
fn="hello world"
}
fn; echo "The value is $fn!" #prints: The value is hello world!
fn; echo "The value is $fn!" #prints: The value is hello world!
#the fn variable doesn't conflict with the fn function
Czy jest to funkcja specyficzna dla myślnika czy gwarancja POSIX?
fn
funkcja znajduje się w osobnej przestrzeni nazw; jeśli wykonanie go raz wyczyściło jego definicję, zobaczylibyśmy dokładnie to samo zachowanie. Powinieneś pokazać, że funkcja jest nadal zdefiniowana, nptype fn
. Później.Odpowiedzi:
Gwarancja :
źródło
unset
ma-v
i-f
do wyboru rozbrojenie zmiennej lub funkcji o podaną nazwę.bash
(w przeciwieństwie do większości innych powłok) będzie rozbroićfoo
funkcję zeunset foo
jeśli nie mafoo
zmienny (!), zachowanie dozwolonych przez POSIX. Dlatego w skryptach POSIX dobrą praktyką jest zawsze używanie jednego-v
lub-f
(i oczywiście również wbash
skryptach, ale należy pamiętać, żeunset
nie zawsze może to rozbroić zmiennąbash
,bash
zakres skalowania ma sporo problemów).Zmienne i funkcje znajdują się w różnych obszarach nazw w myślniku i jest to również określone przez POSIX :
Oprócz tego zmienne mają domyślnie zasięg globalny. Niektóre powłoki (np. Bash, ksh i zsh) zapewniają
local
słowo kluczowe do deklarowania zmiennych w funkcji tylko o zasięgu lokalnym.Tak, więc zachowanie, które widzisz jest gwarantowane przez POSIX.
POSIX nie znormalizowane
local
, ale :(moje podkreślenie)
źródło
local
jeden z najbardziej spójnych interfejsów (w porównaniu do poważnie zepsutego na przykład w bash), bash dopiero niedawno (4.4) pożyczyłlocal -
(dla zasięgu lokalnego opcje) z popiołu (wdrożenie zakresu w stylu popiołu tylko dla tej jednej$-
zmiennej). ksh i yash nie mająlocal
( mają tylko warianty pdkshlocal
), aletypeset
zamiast tego (w ksh93typeset
zapewnia lokalny (statyczny) zasięg tylko w funkcjach zadeklarowanych przy użyciu składni ksh).