Ctrl-C di skrip bash

22

Bagaimana cara menerapkan ctrl+ cpenanganan dalam skrip bash sehingga skrip terputus, serta perintah yang saat ini berjalan diluncurkan oleh skrip?

(Bayangkan ada skrip yang menjalankan beberapa perintah yang sudah berjalan lama. Pengguna memukul ctrl+ cdan menyela perintah, tetapi skrip melanjutkan.) Saya perlu itu berperilaku dengan cara yang membuat mereka berdua terbunuh.

kolypto
sumber
1
Jika OS Anda mengaktifkan kontrol-pekerjaan, opsi lain adalah menghentikan skrip itu (biasanya dengan crtl-z). Anda dapat melanjutkan pekerjaan itu di latar belakang dengan bg, membunuhnya atau melanjutkannya di latar depan fg. Lihat bagian manual bash JOB CONTROL.
ott--

Jawaban:

25

Anda melakukan ini dengan membuat subrutin yang ingin Anda panggil ketika SIGINT diterima, dan Anda harus menjalankannya trap 'subroutinename' INT.

Contoh:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0
Kvisle
sumber
2
Perhatikan bahwa Anda juga dapat menjebak EXITdalam kasus di mana Anda memiliki sesuatu yang ingin Anda jalankan kapan saja skrip keluar terlepas bagaimana itu berhenti. ( KILLdikecualikan, tentu saja.)
Blrfl
Terima kasih banyak! Namun, ketika 'tidur' terbunuh - shell masih dapat mengatur untuk menjalankan perintah selanjutnya ketika rutin trap sedang berjalan: 'echo' dalam kasus ini ... atau saya salah?
kolypto
Itu seharusnya tidak mungkin, tidak. Itu tidak melakukan tugas secara paralel.
Kvisle