Ctrl+D para finalizar la entrada de la línea terminal

Ctrl+D para finalizar la entrada de la línea terminal

Si lo hago

$ cat > file.txt

texto Ctrl- DCtrl-D

Pregunta 1: Si no presiono Enter, ¿por qué tengo que presionar Ctrl- Ddos veces?

Si lo hago

$ cat > file.txt

pa bam pshhh Ctrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
$ cat > file.txt

pa bam pshhh

Ctrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
pa bam pshhh

¿Por qué la segunda vez el archivo tiene 1 línea?

Respuesta1

En Unix, la mayoría de los objetos que se pueden leer y escribir (archivos comunes, tuberías, terminales, unidades de disco sin formato) están hechos para parecerse a archivos.

Un programa como catlee su entrada estándar de esta manera:

n = read(0, buffer, 512);

que solicita 512 bytes. nes el número de bytes realmente leídos, o -1 si hay un error.

Si hiciera esto repetidamente con un archivo normal, obtendría un montón de lecturas de 512 bytes, luego una lectura algo más corta al final del archivo, luego 0 si intentara leer más allá del final del archivo. Entonces, catse ejecutará hasta que nsea <= 0.

Leer desde un terminal es ligeramente diferente. Después de escribir una línea, terminada con la Enterclave, readdevuelve solo esa línea.

Hay algunos caracteres especiales que puedes escribir. Uno es Ctrl-D. Cuando escribes esto, el sistema operativo envía toda la línea actual que has escrito (pero no la Ctrl-Dmisma) al programa que realiza la lectura. Y aquí está lo fortuito: si Ctrl-Des el primer carácter de la línea, al programa se le envía una línea de longitud 0, tal como lo vería el programa si acabara de llegar al final de un archivo normal.cat no necesita hacer nada diferente, ya sea leyendo desde un archivo normal o desde una terminal.

Otro personaje especial es Ctrl-Z. Cuando lo escribes, en cualquier lugar de una línea, el sistema operativo descarta todo lo que hayas escrito hasta ese momento y envía una señal SIGTSTP al programa, que normalmente lo detiene (pausa) y devuelve el control al shell.

Entonces en tu ejemplo

$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+  Stopped         cat > file.txt

usted escribió algunos caracteres que fueron descartados y luego catse detuvo sin haber escrito nada en su archivo de salida.

$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+  Stopped         cat > file.txt

usted escribió una línea, que catleyó y escribió en su archivo de salida, y luego se Ctrl-Zdetuvo cat.

Respuesta2

Eso es porque Ctrl+ Des un truco.

En el fondo, Ctrl+ D(a pesar de ser llamado eleofpersonaje) en realidad no significa fin de archivo: significa "enviar la entrada pendiente a la aplicación ahora". En realidad, esto se acerca al significado de Ctrl+ M( eol), que envía la entrada pendiente más una nueva línea.

Cuando presiona Ctrl+ Dinmediatamente después de Ctrl+ M(es decir, al comienzo de una línea) o después de otro Ctrl+ D, la entrada pendiente está vacía. Por tanto, la aplicación recibe 0 bytes de entrada. en unreadllamada, la lectura de 0 bytes indica el final del archivo.


Cuando presiona Ctrl+ Z, la entrada pendiente se descarta. Por lo tanto, solo se procesa lo que ya se había enviado a la aplicación (que es cat) ingresando una nueva línea o Ctrl+ Dantes de presionar Ctrl+ .Z

información relacionada