Comportamento estranho de controle-d

9

Eu posso usar catcomo um editor de texto muito simples, fazendo cat > foo.txt.
Se eu digitar:

bar
baz

e pressione ctrl+ D, agora fica assim:

$ cat > foo.txt
bar
baz^D

com o cursor no ^. Se eu pressionar novamente, o arquivo será salvo. No entanto, se eu pressionar qualquer coisa (ok, talvez não, mas principalmente qualquer coisa), continuo editando o arquivo.

Esse comportamento é normal?

Tyilo
fonte

Respostas:

13

Sim. Tem a ver com o que ^Drealmente faz: apenas interrompe a read(2)chamada atual .

Se o programa funcionar int rdbytes = read(fd, buffer, sizeof buffer);e você pressionar ^Dentre, read()retornará com os bytes lidos atualmente no buffer, retornando seu número. O mesmo acontece no término da linha; o \nno final é sempre entregue.

Portanto, somente a ^Dno início de uma linha ou após a outra ^Dtem o efeito desejado de ter read()retorno 0, sinalizando EOF.

glglgl
fonte
Depende do que você define como uma linha (com ou sem um final), \nmas é possível pressionar ^Dduas vezes sucessivamente e causar uma condição EOF sem gerar um caractere de nova linha final (como pressionar Enter antes do que ^Dseria).
precisa saber é o seguinte
Você está certo, esqueci de mencionar que: Início da linha e "apenas pressionado ^ D" são as duas situações em que o buffer está vazio, então ^ D terá read()retorno 0, indicando EOF.
glglgl
11

Sim, este é um comportamento normal. Um único Control-D normalmente só começa se for o começo da linha. Isso sai com um Control-D:

$ cat > foo.txt
bar
baz
^D
Klox
fonte
Controlo-D duas vezes no final de uma linha se quebra para fora, sem um char final de linha ...
Peter.O
Sim, você está certo. Eu não quis dizer o contrário. Eu editei minha resposta para esclarecer.
Klox