it-swarm.com.de

Wie kann ich die Bash-Funktion vor dem Überschreiben schützen?

In der Shell bash können wir eine Funktion f mit definieren

f(){ echo Hello; }

und dann ohne Fehler- oder Warnmeldungen mit neu deklarieren/überschreiben

f(){ echo Bye; }

Ich glaube, es gibt eine Möglichkeit, Funktionen davor zu schützen, auf diese Weise überschrieben zu werden.

14
kyb

Sie können eine Funktion foo mit readonly -f foo Oder declare -g -r -f foo Als schreibgeschützte Funktion deklarieren (readonly entspricht declare -g -r). Es ist die Option -f Für diese integrierten Dienstprogramme, mit der sie auf foo als Namen einer Funktion und nicht auf die Variable foo angewendet werden.

$ 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

Wie Sie sehen können, schützt das schreibgeschützte Aktivieren der Funktion nicht nur das Überschreiben, sondern auch das Deaktivieren (vollständige Entfernen).


Derzeit (ab bash-5.0.11) Würde der Versuch, eine schreibgeschützte Funktion zu ändern, die Shell nicht beenden, wenn die Shell-Option errexit (set -e) Verwendet wird. Chet, der Betreuer von bash, sagt, dass dies ein Versehen ist und dass es mit der nächsten Version geändert wird.

Update: Dies wurde zwischen 5.0.11(8)-maint und 5.0.11(9)-maint (Oktober 2019) behoben.

26
Kusalananda