Apakah mungkin memperlakukan blok perintah sebagai fungsi anonim?
function wrap_this {
run_something
# Decide to run block or maybe not.
run_something else
}
wrap_this {
do_something
do_somthing else
}
# Do something else
wrap_this {
do_something_else_else
do_something_else_else_else
}
(Saya sadar Anda membuat fungsi atau file untuk setiap blok, tetapi saya menemukan opsi ini lebih jelas dan lebih mudah dibaca dalam situasi tertentu.)
while
melakukannya dengan do/done
dan function
melakukannya dengan { multiple lines }
. Saya menyadari BASH tidak memiliki fungsi anonim, tetapi apakah mungkin untuk meneruskan beberapa perintah ke fungsi lain, seperti yang dapat Anda lakukan saat mendefinisikan fungsi atau while
?
Jawaban:
Ini adalah solusi terpendek yang dapat saya pikirkan:
Diberikan fungsi-fungsi ini:
Contoh:
(Contoh-contoh ini tentu saja hanya contoh penggunaan, dan pada kenyataannya, gaya ini hanya masuk akal untuk kasus penggunaan yang lebih rumit.)
Secara umum, gaya berikut selalu dapat digunakan:
Ini tidak cukup lambda, tetapi sangat sangat dekat. Hanya beberapa karakter berlebih.
Tetapi singkatan kenyamanan berikut ini tidak berfungsi sejauh yang saya tahu:
Sayangnya,
bash
tidak terlalu cocok untuk gaya ini, meskipun beberapa fitur-fiturnya memiliki gaya yang sangat fungsional.sumber
Saya sudah berhasil melakukan apa yang Anda inginkan dengan
eval
peretasan. Dengan ini saya berbaring memperingatkan bahwa eval tidak aman dan Anda harus menghindari di semua biaya . Karena itu, jika Anda percaya kode Anda tidak akan disalahgunakan, Anda dapat menggunakan ini:Ini memungkinkan Anda untuk menjalankan kode sebagai berikut:
Tidak persis ideal, karena blok bagian dalam adalah string, tetapi tidak membuat penggunaan kembali.
sumber
!!
untuk mencegah penggantian di heredoc. stackoverflow.com/questions/27920806/…Anda dapat menempatkan kode dalam string dan menyebarkannya ke
eval
ataush
atau hanya interpolasi itu.Anda dapat dengan cepat berakhir dalam kesulitan mengutip yang dalam.
sumber
perform { echo "moo" \n echo "moo moo" \n echo "moo moo moo" }
. Saya sudah tahu Anda bisa melewati satu perintah. Tapi, saya mencari beberapa baris, bukan hanya satu perintah atau satu baris. Terima kasih sudah mencoba.Tidak, bash tidak memiliki fungsi anonim. Namun dimungkinkan untuk memberikan nama fungsi dan argumen sebagai string dan bash menyebutnya.
Namun ini agak terbatas. Berurusan dengan mengutip dapat menjadi masalah. Melewati lebih dari satu perintah juga merupakan komplikasi.
sumber
$*
ke"$@"
wrap my_func "$arg1" "$arg2"
. Satu masalah saya dengan contoh ini adalah bahwa nilai kembalinya "$ @" hilang, tapi itu mudah diatasi. Mungkin diinginkan untuk membungkus "$ @" dengan()
untuk memastikan perubahan lingkungan tidak bocor, dengan beberapa biaya kinerja forking.