Jika saya menggunakan trap
seperti dijelaskan misalnya pada http://linuxcommand.org/wss0160.php#trap untuk menangkap ctrl-c (atau serupa) dan pembersihan sebelum keluar maka saya mengubah kode keluar kembali.
Sekarang ini mungkin tidak akan membuat perbedaan di dunia nyata (misalnya karena kode keluar tidak portabel dan di atas itu tidak selalu jelas seperti yang dibahas dalam kode keluar default ketika proses dihentikan? ) Tapi masih saya bertanya-tanya apakah ada benar-benar tidak ada cara untuk mencegah itu dan mengembalikan kode kesalahan default untuk skrip yang terputus?
Contoh (dalam bash, tapi pertanyaan saya tidak boleh dianggap spesifik-bash):
#!/bin/bash
trap 'echo EXIT;' EXIT
read -p 'If you ctrl-c me now my return code will be the default for SIGTERM. ' _
trap 'echo SIGINT; exit 1;' INT
read -p 'If you ctrl-c me now my return code will be 1. ' _
Keluaran:
$ ./test.sh # doing ctrl-c for 1st read
If you ctrl-c me now my return code will be the default for SIGTERM.
$ echo $?
130
$ ./test.sh # doing ctrl-c for 2nd read
If you ctrl-c me now my return code will be the default for SIGTERM.
If you ctrl-c me now my return code will be 1. SIGINT
EXIT
$ echo $?
1
(Diedit untuk menghapus agar lebih sesuai dengan POSIX.)
(Diedit lagi untuk menjadikannya skrip bash sebagai gantinya, pertanyaan saya tidak spesifik untuk shell.)
Diedit untuk menggunakan "INT" portabel untuk jebakan yang mendukung "SIGINT" non-portabel.
Diedit untuk menghilangkan kawat gigi keriting yang tidak berguna dan menambahkan solusi potensial.
Memperbarui:
Saya memecahkannya sekarang dengan hanya keluar dengan beberapa kode kesalahan hardcoded dan menjebak EXIT. Ini mungkin bermasalah pada sistem tertentu karena kode kesalahan mungkin berbeda atau perangkap EXIT tidak mungkin tetapi dalam kasus saya cukup OK.
trap cleanup EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
read -p
membaca input dari proses saat ini.
read
untuk membaca dari proses yang sekarang dantrap cmd SIGINT
tidak akan berfungsi seperti yang dikatakan standar yang harus Anda gunakantrap cmd INT
.