Saya memiliki skrip yang memanggil program (khususnya ttf2afm
, bagian dari tetex 3.0) yang terkadang segfaults dan terkadang tidak. Informasi yang saya butuhkan selalu dicetak sebelum segfaults, tapi saya mengalami kesulitan menghentikan pengalihan pipa gagal dan tidak menghasilkan apa pun ke pipa ketika program gagal.
Saya sudah mencoba mengarahkan ulang melalui FIFO, mengurung proses dengan true
pada akhirnya, mengeksekusi dari fungsi shell dan membungkusnya sh -c
, tetapi skrip sepertinya tidak pernah membiarkan proses menghasilkan apa pun , diarahkan atau sebaliknya - bahkan tidak ke stderr.
Saya tahu itu mampu menghasilkan, karena itu mampu memberikannya dari command-line, tetapi tidak dari skrip untuk beberapa alasan.
Pertanyaan saya adalah, adakah cara agar skrip mengabaikan fakta bahwa program itu segfault dan tetap memberi saya hasilnya?
Saya menjalankan BASH 4.1.10 (2) -release.
sumber
Saya akhirnya menemukan jawabannya melalui proses coba-coba. Solusinya agak berbelit-belit:
Rupanya
exec
penyebabttf2afm
untuk mengambil alih proses subkulit dengan kesalahan yang terperangkap, menyebabkannya beroperasi di lingkungan di mana tidak masalah jika segfaults.Menjebak
ERR
sinyal all-inclusive akan menghentikan subshell dari sekarat dan mengirim sinyal ke skrip utama - yang akan segera berakhir jika itu terjadi - ketika program gagal.Satu-satunya masalah adalah bahwa kernel itu sendiri akan menampilkan sejumlah besar tumpukan jejak sampah langsung ke perangkat konsol setelah proses segfault, jadi tidak ada cara untuk mencegahnya menjadi keluaran [yang saya tahu], tetapi itu tidak masalah karena tidak mempengaruhi stdout atau stderr.
sumber
ttf2afm
secara langsung. Saya bertanya-tanya bagaimana(trap true ERR; exec ttf2afm "$FONT")| …
mengelola untuk berperilaku berbedattf2afm "$FONT" | …
.