bash
シェルでは、関数f
を次のように定義できます
f(){ echo Hello; }
エラーや警告メッセージを出さずに、再宣言/オーバーライドします。
f(){ echo Bye; }
このように関数がオーバーライドされるのを防ぐ方法があると思います。
_readonly -f foo
_または_declare -g -r -f foo
_を使用して、関数foo
を読み取り専用関数として宣言できます(readonly
は_declare -g -r
_と同等です)。これらの組み込みユーティリティの_-f
_オプションは、変数foo
ではなくfoo
を関数の名前として機能させるものです。
_$ foo () { echo Hello; }
$ readonly -f foo
$ foo () { echo Bye; }
bash: foo: readonly function
$ unset -f foo
bash: unset: foo: cannot unset: readonly function
$ foo
Hello
_
ご覧のとおり、関数を読み取り専用にすると、関数がオーバーライドされないように保護されるだけでなく、設定解除(完全に削除)されることも防止されます。
現在(_bash-5.0.11
_以降)、errexit
シェルオプション(_set -e
_)を使用している場合、読み取り専用関数を変更しようとしてもシェルは終了しません。 Chet、bash
メンテナー これは見落としであると言います で、次のリリースで変更される予定です。
更新:これは5.0.11(8)-maint
と5.0.11(9)-maint
の間で修正されました(2019年10月)。