So signalisieren Sie das Ende der stdin-Eingabe

82
  1. In Bash habe ich gelernt, dass das Endsignal durch dieses Dokument geändert werden kann. Aber wie kann ich standardmäßig das Ende der stdin-Eingabe signalisieren?
  2. Ich habe zufällig festgestellt, dass bei cat und chardet ihre stdin-Eingaben durch Strg + d als erledigt signalisiert werden können. Aber ich erinnere mich anscheinend, dass Strg + d und Strg + c dem Beenden der Ausführung eines laufenden Befehls ähneln. Also irre ich mich
Tim
quelle

Antworten:

114

Ctrl+DWenn Sie am Anfang einer Zeile eines Terminals eingeben, bedeutet dies das Ende der Eingabe. Dies ist kein Signal im Sinne von Unix: Wenn eine Anwendung vom Terminal liest und der Benutzer drückt Ctrl+D, wird der Anwendung mitgeteilt, dass das Ende der Datei erreicht wurde (genauso, als ob sie aus einer Datei gelesen und die Prüfung bestanden hätte) letztes Byte).

Ctrl+Csendet ein Signal, SIGINT . Standardmäßig beendet SIGINT (das Interrupt-Signal) die Vordergrundanwendung, aber die Anwendung kann das Signal abfangen und auf andere Weise reagieren (z. B. fängt die Shell selbst das Signal ab und bricht die von Ihnen eingegebene Zeile ab, tut es aber nicht). Beim Beenden wird eine neue Eingabeaufforderung angezeigt und auf eine neue Befehlszeile gewartet.

Sie können die mit Dateiende und SIGINT verknüpften Zeichen mit dem sttyBefehl ändern , z. B. stty eof adas aDateiende-Zeichen erstellen und stty intr ^-das SIGINT-Zeichen deaktivieren. Dies ist selten nützlich.

Gilles
quelle
Vielen Dank! Bedeutet Ctrl+DStrg und Großbuchstabe D oder spielt es keine Rolle?
Tim
5
@Tim: Kleinschreibung ist erwünscht ... Die Konvention, Tastaturbefehle mit Großbuchstaben zu schreiben, kommt daher, dass die Beschriftungen auf der Tastatur immer in Großbuchstaben geschrieben sind und die beschriebene Sache eine KEY SEQUENCE ist, nicht der tatsächliche Zeichencode, den das Programm sieht. Ja, das ist manchmal verwirrend.
Caleb
@Caleb: Danke! Wie soll man angeben, dass der Schlüssel in Kapital ist? Oder gibt es jemals einen solchen Fall?
Tim
@Tim An einem Terminal werden die Tastenkombinationen Ctrl+Shift+Dund Ctrl+Ddas gleiche Zeichen trotzdem gesendet (Zeichennummer 4, normalerweise genannt Ctrl+D).
Gilles
2
@Tim Das Terminal hat Strg + D empfangen. Es wird kein Zeichen an das Programm gesendet. Was passiert ist, dass wenn das Programm vom Terminal liest, das Terminal sagt, dass dies das Ende der Datei ist, so wie wenn ein Programm versucht, nach dem Ende einer Festplattendatei zu lesen. Die Shell ist überhaupt nicht beteiligt.
Gilles
23

Ihr zweiter Punkt fasst zwei völlig verschiedene Dinge zusammen.

  • Strg + C sendet ein Kill-Signal an den laufenden Prozess.
  • Strg + D sendet ein Zeichen für das Ende der Übertragung .

Sie suchen nach Letzterem.

Caleb
quelle
7
Verwechslungsgefahr hier: Aus Anwendungssicht wird für ^ D kein tatsächliches Zeichen gesendet. Dies bedeutet, dass die Anwendung dieses Zeichen nicht vom Systemaufruf erhält read(2).
Ulidtko