No bash
shell, podemos definir uma função f
com
f(){ echo Hello; }
redeclarar / substituir, sem nenhum erro ou mensagem de aviso, com
f(){ echo Bye; }
Eu acredito que existe uma maneira de proteger as funções de serem substituídas dessa maneira.
bash
bash-functions
kyb
fonte
fonte
typeset -r
:typeset -rf f
.readonly -f f
Respostas:
Você pode declarar
f
como uma função somente leitura usandoreadonly -f f
oudeclare -g -r -f f
(readonly
é equivalente adeclare -g -r
). É a-f
opção para esses utilitários internos que os faz agirf
como o nome de uma função, e não na variávelf
.Como você pode ver, tornar a função somente leitura não apenas a impede de ser substituída, mas também a de ser desmarcada (removida completamente).
Atualmente (a partir de
bash-5.0.11
), tentar modificar uma função somente leitura não encerraria o shell se alguém estiver usando aerrexit
opção shell (set -e
). Chet, obash
mantenedor, diz que isso é um descuido e que será alterado no próximo lançamento.fonte
bash: f: readonly function
e código de status diferente de zero, mas não sai se aerrexit
opção estiver ativada.bash
, mas pedirei em uma dasbash
listas de discussão para ter certeza.bash
só sai quandoset -e
está em vigor quando o POSIX exige (ereadonly -f
não é POSIX). Greg ressalta que obash
manual nunca menciona "falha na declaração de função" como motivo paraerrexit
acionar uma saída (a menos que uma declaração de função conte como um comando composto, o que ele tem certeza de que não). O tópico está em andamento aqui: lists.gnu.org/archive/html/help-bash/2019-09/msg00039.htmlerrexit
ou estáset -e
em sua pergunta.