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?

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.


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

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
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.