Cegah perintah agar tidak berhenti saat menekan CTRL + C

28

Jadi, saya memainkan beberapa Zork 1 dan saya pergi untuk menyalin beberapa teks untuk menunjukkan kepada teman saya, tetapi saya tidak sengaja lupa untuk memegang tombol shift ketika menekan CTRL+ C. Ini menghentikan perintah dan saya kehilangan data Zork saya ...

Apakah ada semacam "bermanfaat" tip mereka yang dapat saya gunakan untuk mencegah menghentikan perintah ketika menekan tombol CTRL+ C?

Perhatikan bahwa Zork dijalankan di dalam terminal. Ini adalah permainan berbasis terminal di mana Anda memberi perintah untuk melakukan tindakan yang berbeda.


sumber
Jadi Anda ingin Ctrl + c untuk mencegah pemutusan semua aplikasi sekaligus? Itu mungkin menjadi bencana di masa depan.
jobin

Jawaban:

30

Kombinasi tombol Ctrl+ Cmengirimkan karakter ^C(nilai byte 3). Ini menyebabkan terminal mengirim sinyal SIGINT ke program yang berjalan di latar depan¹. Tindakan konvensional untuk sinyal ini adalah menginterupsi perintah saat ini: program yang dirancang untuk memproses perintah berturut-turut kembali ke prompt tingkat atas, sementara program dirancang sebagai perintah batch tunggal atau keluar interaksi terus menerus. Jelas program yang Anda gunakan dirancang sesuai dengan model kedua.

Kunci pengiriman sinyal ini adalah fitur antarmuka terminal umum di kernel, dibagikan oleh semua emulator terminal dan terminal fisik nyata. Anda dapat mengkonfigurasi kunci mana yang mengirim sinyal ini, serta tombol lain (terutama CtrlZmengirim SIGSTOP untuk menunda program latar depan) dengan sttyperintah. Untuk mengalihkan kunci untuk SIGINT ke Ctrl+ _(di terminal saat ini):

stty intr '^_'

Untuk menonaktifkannya sama sekali:

stty intr ''

Untuk mengatur ulang semua pengaturan ke default:

stty sane

Kunci tidak dapat berupa kombinasi kunci arbitrer, itu harus berupa nilai byte tunggal. The sttyPengaturan dapat ditimpa oleh program - beberapa program (terutama program mode teks layar penuh) melakukan pengolahan pintas keyboard mereka sendiri.

¹ Lebih tepatnya , untuk semua proses dalam kelompok proses latar depan dimana terminal adalah terminal pengendali .

Gilles 'SANGAT berhenti menjadi jahat'
sumber
32

CTRL+ Cmengirimkan sinyal interupsi ( SIGINT, yaitu sinyal nomor 2) ke pekerjaan di latar depan. Anda dapat menonaktifkan ini dengan "menjebak" sinyal menggunakan trap '' 2perintah sebelum memulai Zork.

Aktifkan kembali CTRL+ C(membuka bungkusan SIGINT) dengan trap 2.

Kiat : Anda dapat menambahkan sesuatu seperti ini ke ~/.bashrc:

alias zork="(trap '' 2 && cd ~/path/to/zork/ && frotz ZORK1.DAT)"

Dengan cara ini Anda tidak akan pernah lupa untuk menonaktifkan dan mengaktifkan kembali sinyal dan lebih mudah untuk memulai permainan hanya dengan mengetik zorkdi terminal.

Catatan : Anda dapat menggunakan nama sinyal alih-alih nomornya jika lebih nyaman bagi Anda, yaitu trap '' sigintatau trap '' int. Saya hanya terbiasa menggunakan angka-angka, misalnya dalam kill -9dan semacamnya.

kraxor
sumber