Strg+D zum Beenden der Terminalzeileneingabe

Strg+D zum Beenden der Terminalzeileneingabe

Wenn ich mache

$ cat > file.txt

Text Ctrl- DCtrl-D

Frage 1: Wenn ich nicht die Eingabetaste drücke, warum muss ich dann zweimal Ctrl- drücken D?

Wenn ich mache

$ 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

Warum besteht die Datei beim zweiten Mal nur aus einer Zeile?

Antwort1

Unter Unix sind die meisten Objekte, die Sie lesen und schreiben können – normale Dateien, Pipes, Terminals, einfache Festplattenlaufwerke – so gestaltet, dass sie Dateien ähneln.

Ein Programm wie catdieses liest von seiner Standardeingabe:

n = read(0, buffer, 512);

Dies erfordert 512 Bytes. nist die Anzahl der tatsächlich gelesenen Bytes oder -1, wenn ein Fehler vorliegt.

Wenn Sie dies wiederholt mit einer normalen Datei tun würden, würden Sie eine Reihe von 512-Byte-Lesevorgängen erhalten, dann einen etwas kürzeren Lesevorgang am Ende der Datei und dann 0, wenn Sie versucht haben, über das Ende der Datei hinaus zu lesen. catWird also ausgeführt, bis n<= 0 ist.

Das Lesen von einem Terminal aus ist etwas anders. Nachdem Sie eine Zeile eingegeben haben, wird, abgeschlossen durch die EnterTaste, readnur diese Zeile zurückgegeben.

Es gibt einige Sonderzeichen, die Sie eingeben können. Eines davon ist Ctrl-D. Wenn Sie dieses eingeben, sendet das Betriebssystem die gesamte aktuelle Zeile, die Sie eingegeben haben (aber nicht die Zeile Ctrl-Dselbst), an das Programm, das den Lesevorgang durchführt. Und hier ist der glückliche Zufall: Wenn Ctrl-Ddas erste Zeichen in der Zeile ist, wird dem Programm eine Zeile der Länge 0 gesendet – genau wie das Programm sehen würde, wenn es gerade das Ende einer normalen Datei erreicht hätte.cat muss nichts anders machen, unabhängig davon, ob es sich um das Lesen aus einer normalen Datei oder einem Terminal handelt.

Ein weiteres Sonderzeichen ist Ctrl-Z. Wenn Sie es irgendwo in einer Zeile eingeben, verwirft das Betriebssystem alles, was Sie bis dahin eingegeben haben, und sendet ein SIGTSTP-Signal an das Programm, das es normalerweise stoppt (pausiert) und die Kontrolle an die Shell zurückgibt.

Also in deinem Beispiel

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

Sie haben einige Zeichen eingegeben, die verworfen wurden, und catwurden dann angehalten, ohne etwas in die Ausgabedatei geschrieben zu haben.

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

Sie haben eine Zeile eingegeben, die catdie Ausgabedatei gelesen und in sie geschrieben hat, und dann wurde der Ctrl-ZVorgang angehalten cat.

Antwort2

Das liegt daran, dass Ctrl+ Dein Hack ist.

Tief im Inneren, Ctrl+ D(obwohl es alseofCharakter) bedeutet nicht wirklich Dateiende, sondern „sende die ausstehende Eingabe jetzt an die Anwendung“. Dies kommt eigentlich der Bedeutung von Ctrl+ M( eol) sehr nahe, das die ausstehende Eingabe plus eine neue Zeile sendet.

CtrlWenn Sie + Dunmittelbar nach einem Ctrl+ M(also am Anfang einer Zeile) oder nach einem weiteren Ctrl+ drücken D, ist die anstehende Eingabe leer. Somit erhält die Anwendung 0 Bytes Eingabe. In einemreadAufruf, das Lesen von 0 Bytes signalisiert das Ende der Datei.


Wenn Sie Ctrl+ drücken, wird die ausstehende Eingabe verworfen. Es wird also nur das verarbeitet, was bereits vor dem Drücken von + durch die Eingabe eines Zeilenumbruchs oder + Zan die Anwendung gesendet wurde (also ) .catCtrlDCtrlZ

verwandte Informationen