Dalam tanda hubung, fungsi dan variabel tampaknya hidup di ruang nama yang terpisah:
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
Apakah ini fitur khusus dasbor atau jaminan POSIX?
fn
fungsi tersebut berada dalam ruang nama yang terpisah; jika mengeksekusi sekali menghapus definisi, kita akan melihat perilaku yang sama persis. Anda harus menunjukkan bahwa fungsi masih didefinisikan, misalnya dengantype fn
sesudahnya.Jawaban:
Jaminan :
sumber
unset
memiliki-v
dan-f
untuk memilih antara tidak menyetel variabel atau fungsi dengan nama yang diberikan.bash
(kebalikan dari kebanyakan shell lain) akan menghapusfoo
fungsi denganunset foo
jika tidak adafoo
variabel (!), perilaku yang diizinkan oleh POSIX. Itu sebabnya dalam skrip POSIX itu praktik yang baik untuk selalu menggunakan salah satu-v
atau-f
(dan tentu saja dalambash
skrip juga, tetapi perhatikan bahwaunset
mungkin tidak selalu menghapus variabel dalambash
,bash
pelingkupan variabel memiliki beberapa masalah).Variabel dan fungsi berada di ruang nama yang berbeda di dasbor dan ini juga ditentukan oleh POSIX :
Selain itu, secara default variabel memiliki cakupan global. Beberapa shell (mis. Bash, ksh dan zsh) menyediakan
local
kata kunci untuk mendeklarasikan variabel dalam suatu fungsi dengan cakupan lokal saja.Jadi, ya, perilaku yang Anda lihat dijamin oleh POSIX.
POSIX belum distandarisasi
local
, namun :(penekanan milikku)
sumber
local
, salah satu antarmuka paling konsisten di luar sana (dibandingkan dengan yang rusak parah di bash misalnya), bash baru-baru ini (4.4) meminjamlocal -
(untuk lingkup lokal untuk opsi) dari abu (menerapkan pelingkupan gaya abu untuk satu$-
variabel saja). ksh dan yash tidak memilikilocal
(hanya varian pdksh yang dimilikilocal
), tetapitypeset
sebaliknya (dalam ksh93typeset
menyediakan lingkup lokal (statis) hanya dalam fungsi yang dideklarasikan menggunakan sintaks ksh).