Risposte:
È possibile dichiarare f
come funzione di sola lettura utilizzando readonly -f f
o declare -g -r -f f
( readonly
è equivalente a declare -g -r
). È l' -f
opzione per queste utility integrate che le fa agire f
come il nome di una funzione, piuttosto che sulla variabile 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
Come puoi vedere, rendere la funzione di sola lettura non solo la protegge dall'essere sovrascritta, ma la protegge anche dall'essere disinserita (rimossa completamente).
Attualmente (a partire da bash-5.0.11
), provare a modificare una funzione di sola lettura non terminerebbe la shell se si utilizza l' errexit
opzione shell ( set -e
). Chet, il bash
manutentore, afferma che questa è una svista e che verrà modificata con la prossima versione.
bash: f: readonly function
e un codice di stato diverso da zero, ma non termina se l' errexit
opzione è abilitata.
bash
, ma chiederò una bash
mailing list per esserne sicuro.
bash
esce solo quando set -e
è in vigore quando POSIX lo richiede (e readonly -f
non è POSIX). Greg sottolinea che il bash
manuale non menziona mai il "fallimento nella dichiarazione di funzione" come motivo per errexit
innescare un'uscita (a meno che una dichiarazione di funzione non valga come un comando composto, che è abbastanza sicuro che non lo faccia). Il filo è in corso qui: lists.gnu.org/archive/html/help-bash/2019-09/msg00039.html
errexit
o set -e
nella tua domanda.
typeset -r
:typeset -rf f
.