Menarik. Ini tampaknya merupakan perilaku spesifik-Bash.
Saya mencoba 3 kerang yang kompatibel dengan POSIX lainnya (zsh, dash, busybox), dan semuanya echo "$(trap)"
memberikan hasil yang sama seperti (trap)
: subshell dijalankan, dan subshell tidak menunjukkan EXIT
jebakan.
(Catatan yang trap -p
khusus untuk Bash, dan tanpa parameter tambahan itu melakukan hal yang sama seperti trap
tanpa parameter.)
Perilaku Bash berpotensi berguna : itu artinya Anda dapat menulis a="$(trap)"
untuk mengambil pengaturan perangkap dari shell induk, yang lebih cenderung menarik.
Namun, jika Anda mengatur atau menghapus jebakan dalam subkulit, maka itu akan mencantumkan perangkap subkulit sebagai ganti dari induknya:
$ trap 'echo bye' EXIT
$ echo "$(trap TERM; trap)" # explicitly clear TERM, but leave EXIT alone
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
Jadi mereka juga telah membahas kasus langka di mana Anda tertarik pada jebakan subkulit.
Secara umum, saya perhatikan bahwa pengembang Bash tampaknya telah melakukan upaya ekstra untuk membuat penanganan subshell berfungsi dengan baik. Ini juga jauh lebih mudah untuk mengelola subproses latar belakang dengan Bash daripada dengan shell POSIX yang lebih minimal.