The SHELLSHOCK bug di bash bekerja dengan cara variabel lingkungan. Jujur saya terkejut oleh fakta bahwa ada fitur seperti:
"meneruskan definisi fungsi melalui env vars"
Oleh karena itu pertanyaan ini sementara mungkin tidak diformulasikan dengan sempurna adalah untuk meminta contoh atau kasus di mana akan diperlukan untuk memiliki fitur ini?
Bonus. Apakah shell lain zsh, dash dll juga memiliki fitur ini?
bash
environment-variables
function
shellshock
humanityANDpeace
sumber
sumber
parallel
mendapatkan definisi fungsi yang terdistribusi jika ia memanggil beberapa instance bash. Jika tidak dengan cara itu harus menulis yang ada di file, bahwa setiap contoh dipanggil membaca dan kemudian Anda harus berurusan dengan masalah seperti kapan file itu dapat dihapus..dot
sumber file yang sama dengan shell lama. Itulah yang dilakukan - dan itu masuk akal - atau Anda memberi makan shell baru file tersebut sebagai input saatexec
ing. setelah dibaca setelah file di-cache oleh kernel.Jawaban:
Ketika skrip memanggil skrip lain, variabel skrip induk dapat diekspor, dan kemudian mereka akan terlihat di skrip anak. Mengekspor fungsi adalah generalisasi yang jelas: mengekspor fungsi dari orang tua, membuatnya terlihat pada anak.
Lingkungan adalah satu-satunya cara yang nyaman bagi suatu proses untuk memberikan data yang sewenang-wenang kepada anak-anaknya. Data harus diolah menjadi string yang tidak mengandung byte nol, yang tidak menyulitkan fungsi shell. Ada metode potensial lainnya, seperti blok memori bersama atau file sementara yang dikirimkan melalui deskriptor file, tetapi ini dapat menyebabkan masalah dengan program perantara yang tidak tahu apa yang harus dilakukan dengan mereka atau akan menutupnya. Program berharap berjalan di lingkungan yang berisi variabel yang tidak mereka ketahui atau pedulikan, sehingga mereka tidak akan menimpa atau menghapusnya.
Pilihan menggunakan nama fungsi sebagai nama variabel lingkungan adalah aneh. Untuk satu hal, itu berarti bahwa variabel yang diekspor bentrok dengan fungsi yang diekspor dengan nama yang sama.
Fungsi yang diekspor adalah fitur lama. Fungsi ditambahkan dalam shell Bourne di SVR2 , dan fungsi yang diekspor di shell Versi 8 dirilis pada tahun yang sama (1984). Dalam shell itu, variabel dan fungsi menggunakan namespace yang sama. Saya tidak tahu bagaimana fungsi ekspor berfungsi. The Heirloom shell didasarkan pada varian Bourne yang memiliki fungsi tetapi tidak ekspor mereka.
ATT ksh seharusnya mendukung fungsi ekspor, tetapi melihat sumbernya atau bermain dengannya, saya tidak dapat melihatnya, pada ksh93u.
Klon domain publik Ksh (pdksh, mksh), tanda hubung dan zsh tidak mendukung fungsi ekspor.
sumber
BASH_FUNC_f%%=() { echo hi }
. Mengapa bash mem-parsing variabel lingkungan lainnya? Mengapa itu bahkan diuraiBASH_FUNC_g%%
ketika saya hanya meneleponf
? (Rupanya, pre-shellshock, variabel lingkungan baru saja dipanggilf
ataug
- tapi saya masih bertanya-tanya mengapag
akan diuraikan jika saya tidak pernah memanggilg
skrip saya)f
, (1) memeriksa fungsi shell yang disebutf
, (2) memeriksa variabel lingkungan yang dipanggilf
, dan mencoba menguraikannya, (3) periksa setiapPATH
komponen untuk dieksekusi disebutf
. Bagaimana bisa mem-parsing setiap variabel lingkungan sebagai kode shell, pada startup shell, tampak seperti desain yang tidak terlalu rumit?unset -f foo
, bash tidak boleh lagi mencari definisi fungsifoo
di lingkungan), ketika mendaftar fungsi (bagaimana Anda menanganideclare -f
selain membaca semua variabel lingkungan?) , dan apa pun yang saya tidak pikirkan. Desain Anda hanya tampak lebih mudah karena Anda mengabaikan sebagian besar. Sebaliknya, melakukan segala sesuatu saat startup adalah sepotong kode dan setelah itu semuanya berfungsi.