Странное поведение

9

Я могу использовать catв качестве очень простого текстового редактора, делая cat > foo.txt.
Если я тогда наберу:

bar
baz

а затем нажмите ctrl+ D, теперь это выглядит так:

$ cat > foo.txt
bar
baz^D

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

Это нормальное поведение?

Tyilo
источник

Ответы:

13

Да. Это связано с тем, ^Dчто делает: просто останавливает текущий read(2)вызов.

Если программа делает это, int rdbytes = read(fd, buffer, sizeof buffer);и вы нажимаете ^Dinbetween, read()возвращается с текущими считанными байтами в буфере, возвращая их число. То же самое происходит при прекращении линии; \nв конце всегда поставляется.

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

glglgl
источник
Это зависит от того, какой линией вы определяете (с или без трейлинга), \nно можно просто нажать ^Dдва раза подряд и вызвать условие EOF без генерации окончательного символа новой строки (как при нажатии Enter перед тем, как ^Dбудет сделано).
Peter.O
Вы правы, я забыл упомянуть, что: начало строки и «только что нажали ^ D» - это две ситуации, когда буфер пуст, поэтому ^ D будет read()возвращаться 0, указывая EOF.
glglgl
11

Да, это нормальное поведение. Один Control-D обычно срабатывает только в начале строки. Это выходит с одним Control-D:

$ cat > foo.txt
bar
baz
^D
Klox
источник
Control-D дважды в конце строки не
срабатывает
Да, ты прав. Я не хотел подразумевать иное. Я отредактировал свой ответ, чтобы уточнить.
Klox