В bash
оболочке мы можем определить функцию f
с
f(){ echo Hello; }
а затем повторно объявить / переопределить его, без каких-либо сообщений об ошибках или предупреждений, с помощью
f(){ echo Bye; }
Я считаю, что есть способ защитить функции от переопределения таким образом.
typeset -r
:typeset -rf f
.readonly -f f
Ответы:
Вы можете объявить
f
функцию только для чтения, используяreadonly -f f
илиdeclare -g -r -f f
(readonly
эквивалентноdeclare -g -r
). Это-f
опция для этих встроенных утилит, которая заставляет их действоватьf
как имя функции, а не как переменнаяf
.Как видите, создание функции «только для чтения» не только защищает ее от переопределения, но и защищает от сброса (полностью удаляется).
В настоящее время (по состоянию на
bash-5.0.11
) попытка изменить функцию только для чтения не приведет к завершению оболочки, если она использует параметрerrexit
оболочки (set -e
). Чет,bash
сопровождающий, говорит, что это недосмотр и что он будет изменен в следующем выпуске.источник
bash: f: readonly function
и ненулевой код состояния, но не завершается, еслиerrexit
опция включена.bash
, но я попрошу один изbash
списков рассылки, чтобы быть уверенным.bash
выход происходит только тогда, когдаset -e
действует, когда POSIX требует этого (аreadonly -f
не POSIX). Грег отмечает, что вbash
руководстве никогда не упоминается «сбой в объявлении функции» в качестве причины дляerrexit
запуска выхода (если только объявление функции не считается составной командой, что, как он уверен, не делает). Темаerrexit
илиset -e
в своем вопросе.