Variabel lingkungan yang mengandung fungsi adalah bash hack. Zsh tidak memiliki yang serupa. Anda dapat melakukan sesuatu yang serupa dengan beberapa baris kode. Variabel lingkungan mengandung string; versi bash yang lebih lama, sebelum Shellshock ditemukan, menyimpan kode fungsi dalam variabel yang namanya adalah fungsi dan yang nilainya () {
diikuti oleh kode fungsi diikuti oleh }
. Anda dapat menggunakan kode berikut untuk mengimpor variabel dengan penyandian ini, dan mencoba menjalankannya dengan pengaturan mirip-bash. Perhatikan bahwa zsh tidak dapat mengemulasi semua fitur bash, yang dapat Anda lakukan adalah sedikit lebih dekat (mis. Untuk $foo
memisahkan nilai dan memperluas wildcard, dan membuat array berbasis 0).
bash_function_preamble='
emulate -LR ksh
'
for name in ${(k)parameters}; do
[[ "-$parameters[name]-" = *-export-* ]] || continue
[[ ${(P)name} = '() {'*'}' ]] || continue
((! $+builtins[$name])) || continue
functions[$name]=$bash_function_preamble${${${(P)name}#"() {"}%"}"}
done
(Seperti Stéphane Chazelas , penemu asli Shellshock, mencatat, versi sebelumnya dari jawaban ini dapat mengeksekusi kode arbitrer pada titik ini jika definisi fungsi salah. Versi ini tidak, tetapi tentu saja begitu Anda menjalankan perintah, bisa jadi fungsi yang diimpor dari lingkungan.)
Versi Post-Shellshock dari fungsi bash encode di lingkungan menggunakan nama variabel yang tidak valid (misalnya BASH_FUNC_myfunc%%
). Ini membuat mereka lebih sulit untuk menguraikan dengan andal karena zsh tidak menyediakan antarmuka untuk mengekstrak nama variabel seperti itu dari lingkungan.
Saya tidak merekomendasikan melakukan ini. Mengandalkan fungsi yang diekspor dalam skrip adalah ide yang buruk: itu menciptakan ketergantungan yang tidak terlihat dalam skrip Anda. Jika Anda pernah menjalankan skrip Anda di lingkungan yang tidak memiliki fungsi Anda (di komputer lain, dalam tugas cron, setelah mengubah file inisialisasi shell Anda, ...), skrip Anda tidak akan berfungsi lagi. Alih-alih, simpan semua fungsi Anda dalam satu atau beberapa file terpisah (seperti ~/lib/shell/foo.sh
) dan mulai skrip Anda dengan mengimpor fungsi yang digunakannya ( . ~/lib/shell/foo.sh
). Dengan cara ini, jika Anda memodifikasi foo.sh
, Anda dapat dengan mudah mencari skrip mana yang bergantung padanya. Jika Anda menyalin skrip, Anda dapat dengan mudah menemukan file tambahan yang dibutuhkan.
Zsh (dan ksh sebelum itu) membuat ini lebih nyaman dengan menyediakan cara untuk memuat fungsi secara otomatis dalam skrip di mana mereka digunakan. Batasannya adalah Anda hanya dapat menempatkan satu fungsi per file. Deklarasikan fungsi sebagai autoloaded, dan letakkan definisi fungsi dalam file yang namanya adalah nama fungsi. Masukkan file ini ke direktori yang terdaftar $fpath
(yang dapat Anda konfigurasikan melalui FPATH
variabel lingkungan). Dalam skrip Anda, deklarasikan fungsi-fungsi yang diisi-otomatis dengan autoload -U foo
.
Selanjutnya zsh dapat mengkompilasi skrip, untuk menghemat waktu parsing. Panggil zcompile
untuk menyusun skrip. Ini menciptakan file dengan .zwc
ekstensi. Jika file ini ada maka autoload
akan memuat file yang dikompilasi alih-alih kode sumber. Anda dapat menggunakan zrecompile
fungsi untuk (mengkompilasi) semua definisi fungsi dalam direktori.