Risposte:
È possibile dichiarare fcome funzione di sola lettura utilizzando readonly -f fo declare -g -r -f f( readonlyè equivalente a declare -g -r). È l' -fopzione per queste utility integrate che le fa agire fcome 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' errexitopzione shell ( set -e). Chet, il bashmanutentore, afferma che questa è una svista e che verrà modificata con la prossima versione.
bash: f: readonly functione un codice di stato diverso da zero, ma non termina se l' errexitopzione è abilitata.
bash, ma chiederò una bashmailing list per esserne sicuro.
bashesce solo quando set -eè in vigore quando POSIX lo richiede (e readonly -fnon è POSIX). Greg sottolinea che il bashmanuale non menziona mai il "fallimento nella dichiarazione di funzione" come motivo per errexitinnescare 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
errexito set -enella tua domanda.
typeset -r:typeset -rf f.