Perilaku kontrol-d yang aneh

9

Saya dapat menggunakan catsebagai editor teks yang sangat sederhana dengan melakukan cat > foo.txt.
Jika saya kemudian ketik:

bar
baz

dan kemudian tekan ctrl+ D, sekarang akan terlihat seperti ini:

$ cat > foo.txt
bar
baz^D

dengan kursor di jendela ^. Jika saya kemudian tekan sekali lagi file tersebut akan disimpan. Namun jika saya menekan sesuatu (oke mungkin bukan apa-apa, tapi kebanyakan apa saja) yang lain, saya terus mengedit file.

Apakah ini perilaku normal?

Tyilo
sumber

Jawaban:

13

Iya. Ini ^Dbenar - benar ada hubungannya: itu hanya menghentikan read(2)panggilan saat ini .

Jika program berhasil int rdbytes = read(fd, buffer, sizeof buffer);dan Anda menekan di ^Dantara, read()kembali dengan byte yang saat ini dibaca di buffer, mengembalikan nomor mereka. Hal yang sama terjadi pada pemutusan jalur; yang \npada akhirnya selalu disampaikan.

Jadi hanya ^Dpada awal garis atau setelah yang lain ^Dmemiliki efek yang diinginkan memiliki read()kembali 0, menandakan EOF.

glglgl
sumber
Itu tergantung pada apa yang Anda tetapkan menjadi sebuah baris (dengan atau tanpa trailing \n.. tetapi dimungkinkan untuk hanya menekan ^Ddua kali berturut-turut, dan menyebabkan kondisi EOF tanpa menghasilkan char baris baru akhir (seperti menekan Enter sebelum ^Dmau melakukannya).
Peter.O
Anda benar, saya lupa menyebutkan bahwa: Mulai dari baris dan "cukup tekan ^ D" adalah dua situasi di mana buffer kosong, jadi ^ D akan read()kembali 0, menunjukkan EOF.
glglgl
11

Ya, ini adalah perilaku normal. Control-D tunggal biasanya hanya muncul jika itu adalah awal dari garis. Ini keluar dengan satu Control-D:

$ cat > foo.txt
bar
baz
^D
Klox
sumber
Kontrol-D dua kali pada akhir baris tidak pecah, tanpa
jejak
Ya kau benar. Saya tidak bermaksud mengatakan sebaliknya. Saya mengedit jawaban saya untuk menjelaskan.
Klox