Si je fais
$ cat > file.txt
texte Ctrl- DCtrl-D
Question 1: Si je n'appuie pas sur Entrée, pourquoi dois-je appuyer Ctrl- Ddeux fois?
Si je fais
$ 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
Pourquoi est la deuxième fois le fichier avec 1 ligne?
command-line
terminal
cat
brouillard
la source
la source
cat
arrêt?Réponses:
Sous Unix, la plupart des objets que vous pouvez lire et écrire - fichiers ordinaires, canaux, terminaux, lecteurs de disque bruts - sont tous conçus pour ressembler à des fichiers.
Un programme comme
cat
lit à partir de son entrée standard comme ceci:qui demande 512 octets.
n
est le nombre d'octets réellement lus, ou -1 s'il y a une erreur.Si vous faisiez cela à plusieurs reprises avec un fichier ordinaire, vous obtiendrez un tas de lectures de 512 octets, puis une lecture un peu plus courte à la fin du fichier, puis 0 si vous essayez de lire après la fin du fichier. Donc,
cat
s'exécutera jusqu'à ce quen
<= 0.La lecture à partir d'un terminal est légèrement différente. Après avoir tapé une ligne, terminée par la Enterclé,
read
renvoie uniquement cette ligne.Vous pouvez saisir quelques caractères spéciaux. L'un est Ctrl-D. Lorsque vous saisissez cela, le système d'exploitation envoie toute la ligne actuelle que vous avez tapée (mais pas la ligne Ctrl-Delle - même) au programme effectuant la lecture. Et voici la chose fortuite: si Ctrl-Dest le premier caractère sur la ligne, le programme reçoit une ligne de longueur 0 - tout comme le programme verrait s'il arrive juste à la fin d'un fichier ordinaire.
cat
n'a pas besoin de faire quoi que ce soit différemment , que ce soit la lecture d'un fichier ordinaire ou d'un terminal.Un autre caractère spécial est Ctrl-Z. Lorsque vous le tapez, n'importe où dans une ligne, le système d'exploitation rejette tout ce que vous avez tapé jusqu'à ce point et envoie un signal SIGTSTP au programme, qui normalement l'arrête (le met en pause) et rend le contrôle au shell.
Donc, dans votre exemple
vous avez tapé certains caractères qui ont été supprimés, puis avez
cat
été arrêté sans avoir rien écrit dans son fichier de sortie.vous avez tapé une ligne, qui a
cat
lu et écrit dans son fichier de sortie, puis Ctrl-Zarrêtécat
.la source
cat
, qu'un programme qui lirait les données du clavier et ne s'arrêterait pas la première foisread
produirait un zéro pourrait continuer, et le nombre de control-D requis serait déterminé par le nombre de zéros consécutifs nécessaires au programme pour décider qu'il a été fait?ex
éditeur, si vous tapez un contrôle-D comme premier caractère d'une ligne, l'éditeur vous montre quelques lignes du programme plutôt que de quitter. (Dansex
etvi
, Control-D est un mnémonique pour "down"). Et avec de nombreux shells, si vous tapez Control-D mais que des tâches s'exécutent en arrière-plan, le shell vous en informera plutôt que de quitter, mais si vous tapez à nouveau Control-D, le shell décide que vous voulez vraiment quitter de toute façon et le fera.C'est parce que Ctrl+ Dest un hack.
Au fond, Ctrl+ D(bien qu'on l'appelle le
eof
personnage ) ne signifie pas réellement la fin du fichier: cela signifie «envoyer l'entrée en attente à l'application maintenant». C'est en fait proche de la signification de Ctrl+ M(eol
), qui envoie l'entrée en attente plus une nouvelle ligne.Lorsque vous appuyez sur Ctrl+ Dimmédiatement après un Ctrl+ M(c'est-à-dire au début d'une ligne) ou après un autre Ctrl+ D, l'entrée en attente est vide. Ainsi, l'application reçoit 0 octet d'entrée. Lors d'un
read
appel, la lecture de 0 octet signale la fin du fichier.Lorsque vous appuyez sur Ctrl+ Z, l'entrée en attente est supprimée. Ainsi, seul ce qui avait déjà été envoyé à l'application (qui est
cat
) en entrant une nouvelle ligne ou Ctrl+ Davant d'appuyer sur Ctrl+ Zest traité.la source