Si je fais
$ cat > file.txt
texteCtrl-DCtrl-D
Question 1: Si je ne appuis pas entré, pourquoi dois-je appuyer sur Ctrl-D à deux reprises?
Si je fais
$ cat > file.txt
pa Bam PshhhCtrl-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
Pourquoi la deuxième fois le fichier avec 1 ligne?
Dans UNIX, la plupart des objets que vous pouvez lire et écrire des fichiers ordinaires, des tuyaux, des terminaux, des disques bruts - sont tous faits pour ressembler à des fichiers.
Un programme comme cat
lit de son entrée standard comme celle-ci:
n = read(0, buffer, 512);
qui demande 512 octets. n
est le nombre d'octets réellement lus, ou -1 s'il y a une erreur.
Si vous l'avez fait à plusieurs reprises avec un fichier ordinaire, vous obtiendrez une série de lectures de 512 octets, puis une lecture quelque peu plus courte à l'extrémité de la queue du fichier, puis si vous essayez de lire après la fin du fichier. Donc, cat
fonctionnera jusqu'à ce que n
est <= 0.
La lecture d'un terminal est légèrement différente. Après avoir tapé une ligne, terminé par le Enter clé, read
renvoie juste cette ligne.
Vous pouvez taper quelques caractères spéciaux. L'un est Ctrl-D. Lorsque vous tapez ceci, le système d'exploitation envoie toute la ligne actuelle que vous avez saisie (mais pas la Ctrl-D lui-même) au programme en train de lire. Et voici la chose serendipite: si Ctrl-D est le premier caractère de la ligne, le programme est envoyé une ligne de longueur 0 - tout comme le programme verrait si cela vient de passer à la fin d'un fichier ordinaire. cat
n'a rien à faire différemment, qu'il s'agisse de la lecture d'un fichier ordinaire ou d'un terminal.
Un autre caractère spécial est Ctrl-Z. Lorsque vous le tapartissez, n'importe où dans une ligne, le système d'exploitation ne résiste à ce que vous avez tapé jusqu'à ce point et envoie un signal SIGTSTP au programme, qui arrête normalement (pause) et renvoie le contrôle à la coque.
Donc dans votre exemple
$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+ Stopped cat > file.txt
vous avez tapé des caractères qui ont été rejetés, puis cat
a été arrêté sans rien avoir écrit à son fichier de sortie.
$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+ Stopped cat > file.txt
vous avez tapé dans une ligne, que cat
lu et écrit à son fichier de sortie, puis le Ctrl-Z arrêté cat
.
C'est parce que Ctrl+D est un piratage.
Au fond, Ctrl+D (En dépit d'être appelé le eof
caractère ) ne signifie pas réellement fin de fichier: cela signifie "envoyer l'entrée en attente à l'application maintenant". Ceci est en fait proche du sens de Ctrl+M (eol
), qui envoie l'entrée en attente plus une nouvelle ligne.
Quand vous appuyez sur Ctrl+D immédiatement après un Ctrl+M (c'est-à-dire au début d'une ligne) ou après une autre Ctrl+D, l'entrée en attente est vide. Ainsi, l'application reçoit 0 octets d'entrée. Dans A read
appel, la lecture 0 octets signale la fin du fichier.
Quand vous appuyez sur Ctrl+Z, l'entrée en attente est supprimée. Ainsi, ce qui avait déjà été envoyé à l'application (qui est cat
) en entrant une nouvelle ligne ou Ctrl+D avant de faire pression Ctrl+Z est traité.