
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 cat
lee su entrada estándar de esta manera:
n = read(0, buffer, 512);
que solicita 512 bytes. n
es 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, cat
se ejecutará hasta que n
sea <= 0.
Leer desde un terminal es ligeramente diferente. Después de escribir una línea, terminada con la Enterclave, read
devuelve 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 cat
se 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 cat
leyó 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 eleof
personaje) 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 unread
llamada, 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