Seltsames Kontrollverhalten

9

Ich kann es catals sehr einfachen Texteditor verwenden cat > foo.txt.
Wenn ich dann tippe:

bar
baz

und dann ctrl+ drücken D, es sieht jetzt so aus:

$ cat > foo.txt
bar
baz^D

mit dem Cursor auf die ^. Wenn ich es dann noch einmal drücke, wird die Datei gespeichert. Wenn ich jedoch etwas anderes drücke (okay, vielleicht nichts, aber meistens irgendetwas), bearbeite ich die Datei einfach weiter.

Ist das normal?

Tyilo
quelle

Antworten:

13

Ja. Es hat ^Dwirklich damit zu tun : Es stoppt nur den aktuellen read(2)Anruf.

Wenn das Programm dies tut int rdbytes = read(fd, buffer, sizeof buffer);und Sie ^Ddazwischen drücken , read()werden die aktuell gelesenen Bytes im Puffer zurückgegeben und ihre Nummer zurückgegeben. Das gleiche passiert bei der Leitungsbeendigung. das \nam ende wird immer geliefert.

Nur ein ^Dam Anfang einer Zeile oder nach einer anderen ^Dhat den gewünschten Effekt einer read()Rückkehr 0, die EOF signalisiert.

glglgl
quelle
Dies hängt davon ab, wie Sie eine Zeile definieren (mit oder ohne nachfolgend) \n. Es ist jedoch möglich, nur ^Dzweimal hintereinander zu drücken und eine EOF-Bedingung zu verursachen, ohne ein endgültiges Zeichen für eine neue Zeile zu generieren (wie vor dem Drücken der Eingabetaste ^D).
Peter.O
Sie haben Recht, ich habe vergessen zu erwähnen, dass: Zeilenanfang und "nur gedrückt ^ D" sind die beiden Situationen, in denen der Puffer leer ist, also wird ^ D read()zurückkehren 0und EOF anzeigen.
glglgl
11

Ja, das ist normales Verhalten. Ein einzelnes Control-D bricht normalerweise nur aus, wenn es der Anfang der Zeile ist. Dies wird mit einem Control-D beendet:

$ cat > foo.txt
bar
baz
^D
Klox
quelle
Control-D zweimal am Ende einer Zeile bricht aus, ohne ein nachfolgendes Zeilenumbruchzeichen ...
Peter.O
Ja, du hast Recht. Ich wollte nicht anders implizieren. Ich habe meine Antwort zur Verdeutlichung bearbeitet.
Klox