Dalam bash
shell, kita dapat mendefinisikan suatu fungsi f
dengan
f(){ echo Hello; }
dan kemudian mendeklarasikan ulang / menimpanya, tanpa ada pesan kesalahan atau peringatan, dengan
f(){ echo Bye; }
Saya percaya ada cara untuk melindungi fungsi agar tidak ditimpa dengan cara ini.
bash
bash-functions
Kyb
sumber
sumber
typeset -r
:typeset -rf f
.readonly -f f
Jawaban:
Anda dapat mendeklarasikan
f
sebagai fungsi hanya baca menggunakanreadonly -f f
ataudeclare -g -r -f f
(readonly
setara dengandeclare -g -r
). Ini adalah-f
opsi untuk utilitas bawaan ini yang membuat mereka bertindakf
sebagai nama fungsi, bukan pada variabelf
.Seperti yang Anda lihat, membuat fungsi read-only tidak hanya melindunginya dari penggantian, tetapi juga melindunginya dari tidak disetel (dihapus sepenuhnya).
Saat ini (per
bash-5.0.11
), mencoba untuk memodifikasi fungsi read-only tidak akan menghentikan shell jika seseorang menggunakanerrexit
opsi shell (set -e
). Chet, sangbash
pengelola, mengatakan bahwa ini adalah kekhilafan dan bahwa itu akan diubah dengan rilis berikutnya.sumber
bash: f: readonly function
dan kode status tidak nol, tetapi tidak keluar jikaerrexit
opsi diaktifkan.bash
, tetapi saya akan bertanya pada salah satubash
milis untuk memastikan.bash
hanya keluar saatset -e
berlaku ketika POSIX mengharuskannya (danreadonly -f
bukan POSIX). Greg menunjukkan bahwabash
manual tidak pernah menyebutkan "kegagalan dalam deklarasi fungsi" sebagai alasan untukerrexit
memicu keluar (kecuali jika deklarasi fungsi dianggap sebagai perintah majemuk, yang dia cukup yakin tidak). Utas sedang berlangsung di sini: lists.gnu.org/archive/html/help-bash/2019-09/msg00039.htmlerrexit
atauset -e
dalam pertanyaan Anda.