Вы можете объявить f
функцию только для чтения, используя readonly -f f
или declare -g -r -f f
( readonly
эквивалентно declare -g -r
). Это -f
опция для этих встроенных утилит, которая заставляет их действовать f
как имя функции, а не как переменная 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
Как видите, создание функции «только для чтения» не только защищает ее от переопределения, но и защищает от сброса (полностью удаляется).
В настоящее время (по состоянию на bash-5.0.11
) попытка изменить функцию только для чтения не приведет к завершению оболочки, если она использует параметр errexit
оболочки ( set -e
). Чет, bash
сопровождающий, говорит, что это недосмотр и что он будет изменен в следующем выпуске.
typeset -r
:typeset -rf f
.