Saya telah melihat contoh skrip wrapper yang singkatnya adalah sebagai berikut:
#!/bin/bash
myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""
exec "$myprog" "$@"
Seperti yang terlihat di atas, mereka menggunakan exec
untuk segera mengganti shell yang baru dibuat dengan $myprog
. Seseorang dapat mencapai hal yang sama tanpa exec
:
#!/bin/bash
myprog=sleep
echo "This is the wrapper script, it will exec "$myprog""
"$myprog" "$@"
Dalam contoh terakhir ini, instance bash baru dimulai dan kemudian $myprog
dimulai sebagai proses anak dari instance bash.
Apa manfaat dari pendekatan pertama?
exec
builtin shell .Jawaban:
Menggunakan
exec
membuat pembungkus lebih transparan, yaitu membuatnya lebih kecil kemungkinannya bahwa pengguna atau aplikasi yang memanggil skrip perlu menyadari bahwa itu adalah relay yang pada gilirannya meluncurkan program "nyata".Secara khusus, jika penelepon ingin mematikan program, mereka hanya akan mematikan proses yang baru saja mereka luncurkan. Jika skrip wrapper menjalankan proses anak, penelepon harus tahu bahwa mereka harus mencari tahu anak bungkusnya dan membunuh itu sebagai gantinya. Skrip pembungkus dapat mengatur jebakan untuk menyampaikan beberapa sinyal, tetapi itu tidak akan bekerja dengan SIGSTOP atau SIGKILL yang tidak dapat ditangkap.
Memanggil
exec
juga menghemat sedikit memori (dan sumber daya lain seperti PID, dll.) Karena tidak perlu menyimpan shell tambahan tanpa harus melakukan apa pun.Jika ada beberapa pembungkus, masalah bertambah (kesulitan dalam menemukan proses yang tepat untuk membunuh, memori overhead, dll.).
Beberapa shell (mis. Korn shell) secara otomatis mendeteksi kapan sebuah perintah adalah yang terakhir dan tidak ada trap aktif dan meletakkan implisit
exec
, tetapi tidak semua melakukan (mis. Bukan bash).sumber
Tidak menemukan duplikat ... lihat buku pegangan FreeBSD , yang memberikan alasan yang cukup baik:
yang pada dasarnya alasannya dijelaskan kepada saya beberapa waktu lalu (oleh salah satu kuli), dan cukup terkenal.
sumber