Comportamiento extraño de control-d

9

Puedo usarlo catcomo un editor de texto muy simple haciendo cat > foo.txt.
Si luego escribo:

bar
baz

y luego presione ctrl+ D, ahora se ve así:

$ cat > foo.txt
bar
baz^D

con el cursor en el ^. Si lo presiono una vez más, el archivo se guardará. Sin embargo, si presiono algo (está bien, tal vez no cualquier cosa, pero sobre todo cualquier cosa), simplemente continúo editando el archivo.

¿Es este comportamiento normal?

Tyilo
fuente

Respuestas:

13

Si. Tiene que ver con ^Drealmente hace: simplemente detiene la read(2)llamada actual .

Si el programa lo hace int rdbytes = read(fd, buffer, sizeof buffer);y presiona en ^Del medio, read()regresa con los bytes actualmente leídos en el búfer, devolviendo su número. Lo mismo sucede en la terminación de línea; la \nal final siempre se entrega.

Entonces, solo un ^Dal comienzo de una línea o después de otra ^Dtiene el efecto deseado de tener read()retorno 0, señalizando EOF.

glglgl
fuente
Depende de lo que defina que sea una línea (con o sin un final \n... pero es posible presionar ^Ddos veces seguidas y provocar una condición EOF sin generar un carácter de nueva línea final (como presionar Enter antes de lo ^Dque haría).
Peter.O
Tienes razón, olvidé mencionar que: el inicio de la línea y "solo presioné ^ D" son las dos situaciones en las que el búfer está vacío, por lo que ^ D tendrá read()retorno 0, indicando EOF.
glglgl
11

Sí, este es un comportamiento normal. Un solo Control-D normalmente solo explota si es el comienzo de la línea. Esto sale con un Control-D:

$ cat > foo.txt
bar
baz
^D
Klox
fuente
Control-D dos veces al final de una línea
estalla
Sí tienes razón. No quise decir lo contrario. Edité mi respuesta para aclarar.
Klox