Respuestas:
Puede declarar f
como una función de solo lectura usando readonly -f f
o declare -g -r -f f
( readonly
es equivalente a declare -g -r
). Es la -f
opción de estas utilidades integradas lo que hace que actúen f
como el nombre de una función, en lugar de sobre la variable 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
Como puede ver, hacer que la función de solo lectura no solo la proteja de ser anulada, sino que también la protege de ser desarmada (eliminada por completo).
Actualmente (a partir de bash-5.0.11
), intentar modificar una función de solo lectura no terminaría el shell si se usa la errexit
opción de shell ( set -e
). Chet, el bash
mantenedor, dice que esto es un descuido y que se cambiará con la próxima versión.
bash: f: readonly function
y un código de estado distinto de cero, pero no sale si la errexit
opción está habilitada.
bash
, pero preguntaré en una de las bash
listas de correo para estar seguro.
bash
solo se cierra cuando set -e
está vigente cuando POSIX lo requiere (y readonly -f
no es POSIX). Greg señala que el bash
manual nunca menciona la "falla en la declaración de la función" como razón para errexit
desencadenar una salida (a menos que una declaración de función cuente como un comando compuesto, lo cual está bastante seguro de que no lo hace). El hilo está en curso aquí: lists.gnu.org/archive/html/help-bash/2019-09/msg00039.html
errexit
o set -e
en tu pregunta.
typeset -r
:typeset -rf f
.