Cara memberi sinyal akhir input stdin

82
  1. Di Bash, saya belajar bahwa sinyal akhir dapat diubah dengan dokumen di sini. Tetapi secara default bagaimana saya bisa memberi sinyal akhir input stdin?
  2. Saya kebetulan menemukan bahwa dengan cat dan chardet, input stdin mereka dapat ditandai sebagai selesai oleh Ctrl + d. Tapi sepertinya saya ingat bahwa Ctrl + d dan Ctrl + c mirip dengan mengakhiri eksekusi dari perintah yang sedang berjalan. Jadi saya salah?
Tim
sumber

Jawaban:

114

Ctrl+D, ketika mengetik di awal baris pada terminal, menandakan akhir input. Ini bukan sinyal dalam arti unix: ketika aplikasi membaca dari terminal dan pengguna menekan Ctrl+D, aplikasi diberitahu bahwa akhir file telah tercapai (sama seperti jika sedang membaca dari file dan telah melewati byte terakhir).

Ctrl+Ctidak mengirim sinyal, SIGINT . Secara default SIGINT (sinyal interupsi) membunuh aplikasi latar depan, tetapi aplikasi dapat menangkap sinyal dan bereaksi dalam beberapa cara yang berbeda (misalnya, shell itu sendiri menangkap sinyal dan membatalkan garis yang sudah Anda mulai ketik, tetapi tidak t keluar, ini menunjukkan prompt baru dan menunggu baris perintah baru).

Anda dapat mengubah karakter yang terkait dengan file-akhir dan SIGINT dengan sttyperintah, misalnya stty eof aakan membuat akarakter file-akhir, dan stty intr ^-akan menonaktifkan karakter SIGINT. Ini jarang bermanfaat.

Gilles
sumber
Terima kasih! Apakah Ctrl+Dartinya Ctrl dan kapital D atau tidak masalah?
Tim
5
@Tim: huruf kecil yang Anda inginkan ... konvensi penulisan perintah keyboard dengan huruf kapital datang karena label pada keyboard selalu dalam huruf kapital dan hal yang dijelaskan adalah URUTAN KUNCI bukan kode karakter aktual yang dilihat oleh program. Ya ini kadang membingungkan.
Caleb
@ Caleb: Terima kasih! Bagaimana seseorang menentukan bahwa kuncinya ada dalam modal? Atau ada kasus seperti itu?
Tim
@Tim Pada terminal, tombol kombinasi Ctrl+Shift+Ddan tetap Ctrl+Dmengirim karakter yang sama (karakter nomor 4, biasanya disebut Ctrl+D).
Gilles
2
@Tim Terminal menerima Ctrl + D. Itu tidak mengirim karakter ke program. Apa yang terjadi adalah ketika program membaca dari terminal, terminal mengatakan “ini adalah akhir dari file”, sama seperti ketika sebuah program mencoba membaca setelah akhir dari file disk. Shell tidak terlibat sama sekali.
Gilles
23

Poin kedua Anda menggabungkan dua hal yang sama sekali berbeda.

  • Ctrl + C mengirimkan sinyal kill ke proses yang sedang berjalan.
  • Ctrl + D mengirimkan karakter End of Transmission .

Anda mencari yang terakhir.

Caleb
sumber
7
Potensi untuk kebingungan di sini: dari perspektif aplikasi, tidak ada karakter aktual dikirim untuk ^ D. Yang berarti bahwa aplikasi tidak menerima karakter itu dari read(2)syscall.
ulidtko