Bash işlevini geçersiz kılmaktan nasıl korursunuz?


13

Olarak bashkabuk, bir fonksiyonu tanımlayabilir file

f(){ echo Hello; }

ve daha sonra herhangi bir hata veya uyarı mesajı olmadan,

f(){ echo Bye; }

Fonksiyonların bu şekilde geçersiz kılınmasını önlemenin bir yolu olduğuna inanıyorum.


2
ile, değişken ile aynı typeset -r: typeset -rf f.
mosvy

3
veyareadonly -f f
mosvy

Yanıtlar:


25

Sen ilan edebilir fkullanarak salt okunur bir fonksiyonu olarak readonly -f fveya declare -g -r -f f( readonlyeşdeğerdir declare -g -r). Bu var -fseçeneği bu yerleşik onları hareket yapar kamu hizmetleri fyerine değişkeni yerine bir fonksiyonun adı olarak f.

$ f(){ echo Hello; }
$ readonly -f f
$ f(){ echo Bye; }
bash: f: readonly function
$ unset -f f
bash: unset: f: cannot unset: readonly function
$ f
Hello

Gördüğünüz gibi, işlevi salt okunur yapmak yalnızca geçersiz kılmayı değil, aynı zamanda ayarlanmamasını da (tamamen kaldırılmış) korur.


Şu anda (itibarıyla bash-5.0.11), salt okunur işlevini değiştirmeye çalışmak, errexitshell seçeneği ( set -e) kullanılıyorsa kabuğu sonlandırmaz . Chet bashsürdürme, bu bir gözetim olduğunu söyler ve bir sonraki sürümü ile değiştirilecek.


Fonksiyonu geçersiz kılmaya çalış, mesaj bash: f: readonly functionve sıfır olmayan durum kodu üretir , ancak errexitseçenek etkinleştirilirse çıkmaz .
kyb

@kyb Bunu da fark ettim. Bunun bir hata olduğundan emin değilim bash, ancak bashemin olmak için posta listelerinden birini isteyeceğim .
Kusalananda

iyi, lütfen bu davranıştan emin olduğunuzda cevabınızı güncelleyin.
kyb

1
@kyb Hem Stephane Chazelas hem de Greg Wooledge, her ikisi de akla yatkın açıklamalarla bu soruya ağırlık verdiler. Stephane, bashyalnızca set -ePOSIX gerektirdiğinde (ve readonly -fPOSIX olmadığında) geçerli olduğunu belirtir . Greg, bashel kitabının errexitbir çıkışı tetiklemenin nedeni olarak "işlev bildirimindeki başarısızlıktan" asla bahsetmediğine dikkat çekiyor (bir işlev bildirimi bileşik komut olarak sayılmadığı sürece, emin olmadığından emin değil). Konu burada devam ediyor: lists.gnu.org/archive/html/help-bash/2019-09/msg00039.html
Kusalananda

@kyb Ayrıca , sorunuz hakkında errexitveya set -esorunuz hakkında hiçbir şey söylemediğinizi de fark ediyorum .
Kusalananda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.