W bash
powłoce możemy zdefiniować funkcję za f
pomocą
f(){ echo Hello; }
a następnie ponownie utwórz / zastąp to, bez żadnych komunikatów o błędach lub ostrzeżeniach, za pomocą
f(){ echo Bye; }
Wierzę, że istnieje sposób na ochronę funkcji przed zastąpieniem w ten sposób.
bash
bash-functions
kyb
źródło
źródło
typeset -r
:typeset -rf f
.readonly -f f
Odpowiedzi:
Możesz zadeklarować
f
jako funkcję tylko do odczytu, używającreadonly -f f
lubdeclare -g -r -f f
(readonly
jest równoważnedeclare -g -r
). Jest to-f
opcja dla tych wbudowanych narzędzi, która sprawia, że działają onef
jak nazwa funkcji, a nie na zmiennejf
.Jak widać, ustawienie funkcji tylko do odczytu nie tylko chroni ją przed przesłonięciem, ale także chroni przed rozbrojeniem (całkowicie usuniętym).
Obecnie (stan na dzień
bash-5.0.11
) próba modyfikacji funkcji tylko do odczytu nie spowodowałaby zakończenia powłoki, jeśli używa sięerrexit
opcji powłoki (set -e
). Chet,bash
opiekun, mówi, że jest to przeoczenie i że zostanie zmienione w następnej wersji.źródło
bash: f: readonly function
i niezerowy kod stanu, ale nie kończy się, jeślierrexit
opcja jest włączona.bash
, ale zapytam o to na jednej zbash
list mailowych.bash
kończy działanie tylko wtedy, gdyset -e
działa, gdy POSIX tego wymaga (ireadonly -f
nie jest POSIX). Greg zwraca uwagę, żebash
podręcznik nigdy nie wspomina o „niepowodzeniu w deklaracji funkcji” jako przyczynieerrexit
wywołania wyjścia (chyba że deklaracja funkcji liczy się jako polecenie złożone, co jest prawie pewne, że tak nie jest). Wątek trwa tutaj: lists.gnu.org/archive/html/help-bash/2019-09/msg00039.htmlerrexit
lubset -e
w swoim pytaniu.