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.


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.