回答:
または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
)、読み取り専用関数を変更しようとしても、errexit
シェルオプション(set -e
)を使用している場合、シェルは終了しません。bash
メンテナーのChet は、これは見落としであり、次のリリースで変更されると言っています。
bash: f: readonly function
とゼロ以外のステータスコードが生成されますが、errexit
オプションが有効な場合は終了しません。
bash
はbash
わかりませんが、メーリングリストのいずれかで確認してください。
bash
のみ終了することを提案します。グレッグは、マニュアルでは出口をトリガーする理由として「関数宣言の失敗」に言及していないことを指摘しています(関数宣言が複合コマンドとしてカウントされている場合を除き、彼はそうではないと確信しています)。スレッドはここで継続中です。lists.gnu.org / archiveset -e
readonly -f
bash
errexit
errexit
またはset -e
質問で何も言わないことにも気付いています。
typeset -r
ですtypeset -rf f
。