Antworten:
Sie können f
mit readonly -f f
oder declare -g -r -f f
( readonly
entspricht declare -g -r
) als schreibgeschützte Funktion deklarieren . Es ist die -f
Option für diese integrierten Dienstprogramme, mit der sie f
als Name einer Funktion und nicht als Variable fungieren 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
Wie Sie sehen, schützt das Festlegen des Schreibschutzes die Funktion nicht nur vor dem Überschreiben, sondern auch vor dem Deaktivieren (vollständiges Entfernen).
Derzeit (ab bash-5.0.11
) würde der Versuch, eine schreibgeschützte Funktion zu ändern, die Shell nicht beenden, wenn die errexit
Shell-Option ( set -e
) verwendet wird. Chet, der bash
Betreuer, sagt, dass dies ein Versehen ist und dass es mit der nächsten Veröffentlichung geändert wird.
bash: f: readonly function
und einen Statuscode ungleich Null, wird jedoch nicht beendet, wenn die errexit
Option aktiviert ist.
bash
, aber ich werde auf einer der bash
Mailinglisten nachfragen , um sicherzugehen.
bash
nur dann beendet set -e
wird, wenn POSIX dies erfordert (und readonly -f
nicht POSIX). Greg weist darauf hin, dass das bash
Handbuch niemals "Fehler in der Funktionsdeklaration" als Grund für errexit
das Auslösen eines Exits erwähnt (es sei denn, eine Funktionsdeklaration zählt als zusammengesetzter Befehl, was er ziemlich sicher nicht tut). Der Thread läuft hier: lists.gnu.org/archive/html/help-bash/2019-09/msg00039.html
errexit
oder set -e
in Ihrer Frage sagen .
typeset -r
:typeset -rf f
.