web-dev-qa-db-ja.com

上書きされないようにbash関数を保護するにはどうすればよいですか?

bashシェルでは、関数fを次のように定義できます

f(){ echo Hello; }

エラーや警告メッセージを出さずに、再宣言/オーバーライドします。

f(){ echo Bye; }

このように関数がオーバーライドされるのを防ぐ方法があると思います。

14
kyb

_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)-maint5.0.11(9)-maintの間で修正されました(2019年10月)。

26
Kusalananda