Дивна поведінка контролю


9

Я можу використовувати, catяк дуже простий текстовий редактор, роблячи cat > foo.txt.
Якщо я тоді введіть:

bar
baz

а потім натисніть ctrl+ D, це виглядає приблизно так:

$ cat > foo.txt
bar
baz^D

з курсором на ^. Якщо я натисніть його ще раз, файл збережеться. Однак якщо я натискаю що-небудь (добре, можливо, нічого, але в основному все, що завгодно), я просто продовжую редагувати файл.

Це нормальна поведінка?

Відповіді:


13

Так. Це стосується ^Dнасправді: це просто зупиняє поточний read(2)дзвінок.

Якщо програма робить, int rdbytes = read(fd, buffer, sizeof buffer);а ви натискаєте ^Dміж ними, read()повертається з поточно прочитаними байтами в буфері, повертаючи їх кількість. Те саме відбувається при припиненні лінії; \nв кінці завжди поставляється.

Тож лише a ^Dна початку рядка або після іншого ^Dмає бажаний ефект read()повернення 0, сигналізуючи EOF.


Це залежить від того, яким ви визначаєте рядок (з або без трейлінгу), \nале можна просто натиснути ^Dдвічі поспіль і викликати умову EOF, не створюючи остаточну таблицю нового рядка (як натискання клавіші Enter, перш ніж ^Dробити).
Пітер.О

Ви маєте рацію, я забув зазначити, що: Початок рядка та "тільки натиснута ^ D" - це дві ситуації, коли буфер порожній, тому ^ D матиме read()повернення 0, що вказує на EOF.
glglgl

11

Так, це нормальна поведінка. Один Control-D звичайно проривається, лише якщо це початок рядка. Це завершується одним Control-D:

$ cat > foo.txt
bar
baz
^D

Двічі Control-D в кінці рядка не проривається, без
зворотного знаку

Так, ви праві. Я не мав на увазі іншого. Я відредагував свою відповідь, щоб уточнити.
Klox
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.