En el bash
shell, podemos definir una función f
con
f(){ echo Hello; }
y luego redeclararlo / anularlo, sin ningún mensaje de error o advertencia, con
f(){ echo Bye; }
Creo que hay una manera de proteger las funciones de ser anuladas de esta manera.
bash
bash-functions
kyb
fuente
fuente
typeset -r
:typeset -rf f
.readonly -f f
Respuestas:
Puede declarar
f
como una función de solo lectura usandoreadonly -f f
odeclare -g -r -f f
(readonly
es equivalente adeclare -g -r
). Es la-f
opción de estas utilidades integradas lo que hace que actúenf
como el nombre de una función, en lugar de sobre la variablef
.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 laerrexit
opción de shell (set -e
). Chet, elbash
mantenedor, dice que esto es un descuido y que se cambiará con la próxima versión.fuente
bash: f: readonly function
y un código de estado distinto de cero, pero no sale si laerrexit
opción está habilitada.bash
, pero preguntaré en una de lasbash
listas de correo para estar seguro.bash
solo se cierra cuandoset -e
está vigente cuando POSIX lo requiere (yreadonly -f
no es POSIX). Greg señala que elbash
manual nunca menciona la "falla en la declaración de la función" como razón paraerrexit
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.htmlerrexit
oset -e
en tu pregunta.