Apa perbedaan antara ^ C dan ^ D untuk terminal UNIX / Mac OS X?

62

Ketika saya mencoba menghentikan sesuatu, saya menggunakan ^Cdan terkadang ^Ddi terminal.

Apa perbedaan keduanya? Mengapa beberapa program tidak merespons ^C, tetapi ^D. Mengapa Terminal.app hanya berhenti ketika saya gunakan ^D?

prosseek
sumber
FYI: Lihat halaman Wikipedia untuk: AKHIR DARI TEKS karakter U + 0003 diproduksi oleh Control + C, dan AKHIR TRANSMISI karakter U + 0004 diproduksi oleh Control + D.
Basil Bourque

Jawaban:

61

CtrlCmemberitahu terminal untuk mengirim SIGINTke proses latar depan saat ini, yang secara default diterjemahkan menjadi mengakhiri aplikasi. CtrlDmemberitahu terminal bahwa ia harus mendaftarkan EOF pada input standar, yang mem-bash interpretasikan sebagai keinginan untuk keluar.

Ignacio Vazquez-Abrams
sumber
63

Ctrl+ D( ^D) berarti akhir file . Ini hanya bekerja pada awal baris (saya menyederhanakan sedikit), dan tidak berpengaruh jika program tidak membaca input dari terminal. Dalam percobaan Anda, beri ^Dtahu shell bahwa Anda tidak akan mengetik lagi perintah, jadi itu keluar; kemudian terminal keluar karena subprogramnya telah berakhir.

Ctrl+ C( ^C) berarti "interupsi", yaitu, hentikan apa yang Anda lakukan. Secara teknis, menekan ^Cmengirim sinyal INT , yang secara default menghentikan aplikasi, tetapi yang dalam banyak program berarti kembali ke tingkat atas (misalnya, dalam sebuah shell, berhenti mengetikkan baris perintah dan kembali ke prompt yang asli).

Jika suatu program tidak merespons ^C, Anda dapat mencoba Ctrl+ \( ^\). Ini mengirimkan sinyal QUIT , yang secara default menghentikan aplikasi, dan yang tidak begitu banyak menyadap program.

Kunci lain yang mengirim sinyal adalah Ctrl+ Z( ^Z). Ini mengirimkan sinyal TSTP , yang menghentikan sementara program yang berjalan di latar depan. (TSTP adalah kependekan dari "terminal stop"; ini mirip dengan STOP tetapi TSTP dapat diabaikan sedangkan STOP tidak bisa.) Dari shell, Anda dapat melanjutkan eksekusi program dengan fgperintah (melanjutkan di latar depan) atau bgperintah (melanjutkan di Latar Belakang).

Semua kunci ini dapat diubah dengan sttyperintah. Beberapa program, khususnya program layar penuh yang memiliki ikatan utama, menonaktifkannya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Sebuah koreksi kecil: Control-Z mengirimkan sinyal TSTP (terminal stop). Ini dapat ditangkap atau diabaikan oleh proses, sedangkan sinyal STOP tidak bisa.
Chris Page
Membutuhkan ini! macet, dan saya tidak bisa keluar
ahnbizcad
1
Hanya saran mengenai CTRL-D: itu berarti "siram input yang saya ketikkan sejauh ini" dan Jika baris kosong, kemudian baca () kembali dengan nol, dan itu ditafsirkan sebagai "end of file".
luca
Ini adalah informasi yang sangat penting dan bermanfaat; terima kasih atas penjelasan yang komprehensif dan jelas
iono
Hanya ingin tahu, mengapa progam python yang berjalan di shell tidak berhenti dengan ctrl + c, malah diminta KeyboardInterrupt? Itu berhenti dengan ctrl + d (jika di awal baris), dan dengan ctrl + \.
Rick
2

Menambahkan ke 2 jawaban yang sangat bagus di atas, berikut ini sebuah contoh:

Jika Anda mengetikkan pythonshell, ia akan membawa Anda ke prompt >>> python.

Sekarang, jika Anda menekan Ctrl+C, itu akan mengatakan KeyboardInterruptdan tetap di >>>.
Jika Anda masuk ke dalam for loop, misalnya dengan mengetiknya for x in (text):menunggu Anda untuk mengetik lebih lanjut dengan menunjukkan ... prompt, jika Anda menekan Ctrl+Csekarang, itu akan keluar dari pernyataan for dan kembali ke >> >> prompt
Jika Anda menekan Ctrl+Dkapan saja, apakah dalam >>> atau ... itu akan keluar dari python prompt dan kembali ke shell asli.

Demikian pula, jika ssh'ed ke komputer lain, a Ctrl+Cakan mengakhiri perintah yang ada, Ctrl+Dakan melakukan itu dan keluar dari mesin juga. (Juga, Deletekuncinya sama dengan melakukan a Ctrl+D)

Siddhartha
sumber
Saya menghargai jawaban ini. Namun, saya menemukan beberapa ketidakakuratan ketika mencobanya sendiri. Sementara ssh'ed ke mesin remote dan menjalankan proses python, Ctrl + D keluar python dan membawa saya kembali ke prompt mesin remote, itu tidak keluar dari mesin. Juga, tombol Hapus tidak berfungsi sama dengan Ctrl + D dalam hal apa pun, menjalankan python, pada prompt jarak jauh, atau pada prompt lokal saya. Tampaknya tidak melakukan apa-apa, kecuali sebenarnya menghapus karakter saat mengetikkan python, tentu saja. Namun, Ctrl + D bertindak sebagai tombol Hapus saat mengetik, itu menghapus karakter.
Stack Underflow
1
Itu menarik, saya pikir itu mungkin tergantung pada jenis shell yang Anda gunakan (bash, ksh dll).
Siddhartha