Answers:
您可以f
使用readonly -f f
或declare -g -r -f f
(readonly
等同于declare -g -r
)声明为只读函数。-f
这些内置实用程序的选项使它们充当f
函数的名称,而不是变量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
如您所见,将函数设置为只读不仅可以防止其被覆盖,还可以防止其被设置(完全删除)。
目前(截至bash-5.0.11
),试图如果是使用修改只读功能不会终止Shell errexit
外壳选项(set -e
)。bash
维护者Chet 说,这是一个疏忽,它将在下一版本中进行更改。
bash: f: readonly function
和非零状态代码,但是如果errexit
启用了选项,则不会退出。
bash
,但我会要求其中一个bash
邮件列表进行确认。
bash
仅set -e
在POSIX 要求(而readonly -f
不是POSIX)生效时退出。Greg指出,该bash
手册从未提及“函数声明失败”作为errexit
触发退出的原因(除非函数声明算作复合命令,他很确定不会)。该线程正在此处进行:lists.gnu.org/archive/html/help-bash/2019-09/msg00039.html
errexit
或者set -e
在你的问题。
typeset -r
:typeset -rf f
。