Dans le bash
shell, nous pouvons définir une fonction f
avec
f(){ echo Hello; }
puis redéclarer / remplacer, sans aucun message d'erreur ou d'avertissement, avec
f(){ echo Bye; }
Je pense qu'il existe un moyen de protéger les fonctions contre toute substitution de cette manière.
typeset -r
:typeset -rf f
.readonly -f f
Réponses:
Vous pouvez déclarer en
f
tant que fonction en lecture seule en utilisantreadonly -f f
oudeclare -g -r -f f
(readonly
équivaut àdeclare -g -r
). C'est l'-f
option de ces utilitaires intégrés qui les fait agirf
comme le nom d'une fonction, plutôt que comme la variablef
.Comme vous pouvez le voir, le fait de rendre la fonction en lecture seule la protège non seulement de la substitution, mais la protège également de la désactivation (supprimée complètement).
Actuellement (à partir de
bash-5.0.11
), essayer de modifier une fonction en lecture seule ne terminerait pas le shell si l'on utilise l'errexit
option shell (set -e
). Chet, lebash
mainteneur, dit qu'il s'agit d'une erreur et qu'elle sera modifiée avec la prochaine version.la source
bash: f: readonly function
et un code d'état différent de zéro, mais ne se ferme pas si l'errexit
option est activée.bash
, mais je vais demander sur l'une desbash
listes de diffusion pour être sûr.bash
ne quitte que lorsqueset -e
est en vigueur lorsque POSIX l' exige (etreadonly -f
n'est pas POSIX). Greg fait remarquer que lebash
manuel ne mentionne jamais «l'échec de la déclaration de fonction» comme raisonerrexit
de déclencher une sortie (à moins qu'une déclaration de fonction ne compte comme une commande composée, ce qu'il est sûr qu'il ne fait pas). Le fil est en cours ici: lists.gnu.org/archive/html/help-bash/2019-09/msg00039.htmlerrexit
niset -e
dans votre question.