No bash
shell, podemos definir uma função f
com
f(){ echo Hello; }
e então redeclarar/substituir, sem nenhum erro ou mensagem de aviso, com
f(){ echo Bye; }
Eu acredito que há uma maneira de proteger as funções de serem substituídas dessa maneira.
Você pode declarar uma função
foo
como uma função somente leitura usandoreadonly -f foo
oudeclare -g -r -f foo
(readonly
é equivalente adeclare -g -r
). É a-f
opção desses utilitários integrados que os faz agirfoo
como o nome de uma função, em vez da variávelfoo
.Como você pode ver, tornar a função somente leitura não apenas a protege de ser substituída, mas também a protege de ser desativada (removida completamente).
Atualmente (a partir de
bash-5.0.11
), tentar modificar uma função somente leitura não encerrará o shell se 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.Atualização: Isso foi corrigido em outubro de 2019 para
bash-5.1-alpha
, portanto, qualquerbash
versão 5.1 ou posterior seria encerrada corretamente se uma tentativa de modificar uma função somente leitura fosse feita enquanto aerrexit
opção de shell estivesse ativa.Pequena observação à resposta de @Kusalananda. De acordo com o que o mantenedor do bash disse que alterar uma função somente leitura deve acionar o término do shell ao usar o
set -e
.Estou usando o Ubuntu 20.10 com uma versão bash muito mais recente. Infelizmente parece estar quebrado.
teste.sh
Resultado
Eu testei esse script dentro de um contêiner docker usando a versão mais recente do bash e funciona conforme o esperado.