Was ist der Unterschied zwischen ^ C und ^ D für das UNIX / Mac OS X-Terminal?

61

Wenn ich versuche, etwas zu stoppen, benutze ich ^Cund manchmal ^Dim Terminal.

Was ist der Unterschied zwischen den beiden? Warum ein Programm nicht reagiert ^C, aber ^D. Warum wird die Terminal.app nur beendet, wenn ich sie verwende ^D?

Prosseek
quelle
Zur Info: Siehe Wikipedia - Seiten für: END OF TEXT - Zeichen U + 0003 , hergestellt von Strg + C und Ende der Übertragung Zeichen U + 0004 , hergestellt von Strg + D.
Basil Bourque

Antworten:

60

CtrlCWeist das Terminal an, einen SIGINTan den aktuellen Vordergrundprozess zu senden , was standardmäßig zum Beenden der Anwendung führt. CtrlDteilt dem Terminal mit, dass es eine EOF für die Standardeingabe registrieren soll, die als Verlangen nach dem Verlassen interpretiert wird.

Ignacio Vazquez-Abrams
quelle
62

Ctrl+ D( ^D) bedeutet Dateiende . Es funktioniert nur am Anfang einer Zeile (ich vereinfache etwas) und hat keine Auswirkung, wenn das Programm keine Eingaben vom Terminal liest. ^DSagte der Shell in deinem Experiment, dass du keine Befehle mehr eingeben würdest, und sie wurde beendet. dann verließ das Terminal, weil sein Unterprogramm beendet worden war.

Ctrl+ C( ^C) bedeutet "unterbrechen", dh aufhören, was Sie tun. Technisch gesehen ^Csendet Drücken von das INT-Signal , das standardmäßig eine Anwendung beendet, in vielen Programmen jedoch bedeutet, dass Sie zur obersten Ebene zurückkehren (z. B. in einer Shell, beenden Sie die Eingabe einer Befehlszeile und kehren Sie zu einer ursprünglichen Eingabeaufforderung zurück).

Wenn ein Programm nicht reagiert, ^Ckönnen Sie Ctrl+ \( ^\) versuchen . Dadurch wird das Signal QUIT gesendet , das standardmäßig eine Anwendung beendet und von weniger Programmen abgefangen wird.

Eine weitere Taste, die ein Signal sendet, ist Ctrl+ Z( ^Z). Es sendet das TSTP-Signal , das das im Vordergrund laufende Programm anhält . (TSTP ist die Abkürzung für „Terminal Stop“. Es ähnelt STOP , TSTP kann jedoch ignoriert werden, STOP jedoch nicht.) Von der Shell aus können Sie die Ausführung des Programms mit dem fgBefehl (Resume im Vordergrund) oder dem bgBefehl (Resume im Vordergrund) fortsetzen Hintergrund).

Alle diese Tasten können mit dem sttyBefehl geändert werden . Einige Programme, insbesondere Vollbildprogramme mit Tastenbelegung, deaktivieren diese.

Gilles 'SO - hör auf böse zu sein'
quelle
Eine kleine Korrektur: Control-Z sendet das TSTP-Signal (Terminal Stop). Dies kann von Prozessen abgefangen oder ignoriert werden, während das STOP-Signal dies nicht sein kann.
Chris Seite
Brauchte das! es steckte fest und ich konnte nicht raus
ahnbizcad
1
Nur ein Vorschlag zu STRG-D: Es bedeutet "die Eingabe, die ich bisher eingegeben habe, leeren" und wenn die Zeile leer ist, wird read () mit Null zurückgegeben und dies wird als "Dateiende" interpretiert.
Luca
Dies ist eine sehr wichtige und hilfreiche Information. danke für die umfassende und klare erklärung
iono
Nur neugierig, warum wird das Python-Programm, das in der Shell ausgeführt wird, nicht mit Strg + C beendet, sondern fordert stattdessen dazu auf KeyboardInterrupt? Es wird mit Strg + d (wenn am Anfang einer Zeile) und mit Strg + \ beendet.
Rick
2

Nachstehend ein Beispiel zu den beiden wirklich guten Antworten:

Wenn Sie pythondie Shell eingeben, gelangen Sie zur >>> Eingabeaufforderung von Python.

Nun, wenn Sie treffen Ctrl+C, wird es sagen KeyboardInterruptund in der >>> bleiben.
Wenn Sie in eine for-Schleife eintreten, z. B. durch Eingabe, wird for x in (text):darauf gewartet, dass Sie mit einer ... -Aufforderung weitere Zeichen eingeben. Wenn Sie Ctrl+Cjetzt drücken, wird die for-Anweisung beendet und zur >>> -Aufforderung zurückgekehrt,
wenn Sie drücken Ctrl+DEgal ob in >>> oder ... es wird die Python-Eingabeaufforderung verlassen und zur ursprünglichen Shell zurückgekehrt.

Wenn ssh auf einen anderen Computer übertragen Ctrl+Cwird, beendet a alle vorhandenen Befehle, Ctrl+Dführt dies aus und beendet den Computer ebenfalls. (Der DeleteSchlüssel ist auch der gleiche wie bei a Ctrl+D)

Siddhartha
quelle
Ich schätze diese Antwort. Ich habe jedoch einige Ungenauigkeiten festgestellt, als ich es selbst ausprobiert habe. Während ssh'ed auf einem Remote-Computer ausgeführt wird und der Python-Prozess ausgeführt wird, hat Strg + D Python beendet und mich zur Eingabeaufforderung des Remote-Computers zurückgeführt. Der Computer wurde jedoch nicht beendet. Außerdem funktionierte die Entf-Taste in keinem Fall wie Strg + D und führte Python, an der Remote-Eingabeaufforderung oder an meiner lokalen Eingabeaufforderung aus. Es schien nichts zu tun, außer tatsächlich Zeichen zu löschen, während Sie in Python tippen, natürlich. Strg + D fungierte jedoch beim Eingeben als Entf-Taste und löschte Zeichen.
Stack Underflow
1
Das ist interessant, ich denke, es könnte von der Art der Shell abhängen, die Sie verwenden (bash, ksh usw.).
Siddhartha