web-dev-qa-db-fra.com

Ctrl + D pour la fin de la ligne de terminal

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?

21
mist

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. catn'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.

30
Mark Plotnick

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é.