Was macht STRG + 4 (und STRG + \) in der Bash?

22

Ich habe gerade zufällig herausgefunden, dass CTRL+ 4 Programme geschlossen werden, die stdinEingaben über die Befehlszeile lesen .

So sieht es aus, wenn ich CTRL+ 4oder CTRL+ / in Programme schreibestdin

$ cat
wefwef
wefwef
^\Quit
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'. 
^\Quit
$

Ich werde ^\Quitangezeigt und dann wird das Programm geschlossen. Was ist der Unterschied zu ^Coder ^D? Was macht ^\Quitdas?

Edit : Fand heraus, dass CTRL+ \genau das Gleiche tut.

wefwefa3
quelle

Antworten:

37

Strg + 4 sendet ^ \

Terminals senden Zeichen (oder genauer Bytes), keine Schlüssel. Wenn eine Taste gedrückt wird, die ein druckbares Zeichen darstellt, sendet das Terminal dieses Zeichen an die Anwendung. Die meisten Funktionstasten sind als Escape-Sequenzen codiert: Sequenzen von Zeichen, die mit der Zeichennummer 27 beginnen. Einige Tastenkombinationen der Form Ctrl+ characterund einige Funktionstasten werden als Steuerzeichen gesendet - im ASCII-Zeichensatz , den alle modernen Computer verwenden als Basis verwenden (Unicode, ISO Latin- nusw. sind alle Obermengen von ASCII), 33 Zeichen sind Steuerzeichen: Zeichen Nr. 0 bis 31 und 127. Steuerzeichen sind nicht druckbar, sollen aber in Anwendungen eine Wirkung haben; Beispielsweise ist das Zeichen 10, bei dem es sich um Control-J handelt (normalerweise ^ J), ein Zeilenumbruchzeichen. Wenn ein Terminal dieses Zeichen anzeigt, bewegt es den Cursor in die nächste Zeile, anstatt ein Symbol anzuzeigen. Das Escape-Zeichen selbst ist ein Steuerzeichen ^ [(Wert 27).

Es sind nicht genügend Steuerzeichen vorhanden, um alle Ctrl+ characterTastenkombinationen abzudecken. Nur Buchstaben und die Zeichen @[\]^_?haben ein entsprechendes Steuerzeichen. Wenn Sie Ctrl+ 4oder Ctrl+ drücken $(was meiner Meinung nach Ctrl+ Shift+ ist 4), muss das Terminal etwas zum Senden auswählen. Abhängig vom Terminal und seiner Konfiguration gibt es mehrere gängige Möglichkeiten:

  • Das Terminal ignoriert den CtrlModifikator und sendet das Zeichen 4oder $.
  • Das Terminal sendet eine Escape-Sequenz, die die exakte Taste und die Modifikatoren codiert, die gedrückt wurden.
  • Das Terminal sendet ein anderes Steuerzeichen.

Viele Terminals senden Steuerzeichen für einige Tasten in der Ziffernreihe:

  • Ctrl+ 2→ ^ @
  • Ctrl+ 3→ ^ [
  • Ctrl+ 4→ ^ \
  • Ctrl+ 5→ ^]
  • Ctrl+ 6→ ^^
  • Ctrl+ 7→ ^ _
  • Ctrl+ 8→ ^?

Ich weiß nicht, wo diese besondere Konvention entstanden ist.

Ctrl+ |sendet dasselbe Zeichen, weil es Ctrl+ Shift+ ist \und das Terminal ^ \ sendet, ob die Umschalttaste gedrückt wurde oder nicht.

^ \ wird beendet

Das Terminal selbst (genauer gesagt die generische Terminal-Unterstützung im Kernel) interpretiert einige Steuerzeichen speziell. Diese Interpretation kann so konfiguriert werden, dass verschiedene Zeichen zugeordnet oder von Anwendungen deaktiviert werden, die die Zeichen selbst verarbeiten möchten. Eine bekannte Interpretation dieser Art ist, dass ^ M, das von der ReturnTaste gesendete Zeichen, die aktuelle Zeile an die Anwendung sendet, wenn sich das Terminal im Kochmodus befindet , in dem die Anwendungen zeilenweise Eingaben empfangen.

Einige Zeichen senden im Vordergrund Signale an die Anwendung. ^ C sendet das Interruptsignal (SIGINT), das die Anwendung üblicherweise auffordert, die Ausführung zu stoppen und den nächsten Befehl des Benutzers zu lesen. Nicht interaktive Anwendungen werden normalerweise beendet. ^ \ sendet das Beendigungssignal (SIGQUIT), das die Anwendung üblicherweise anweist, so schnell wie möglich zu beenden , ohne etwas zu speichern. Viele Anwendungen überschreiben nicht das Standardverhalten, nämlich das sofortige Beenden der Anwendung¹. Wenn Sie also Ctrl+ drücken 4(oder irgendetwas, das das Zeichen ^ \ sendet) catoder bc, wobei keines der beiden das Standardverhalten außer Kraft setzt, wird die Anwendung beendet.

Das Terminal selbst druckt den ^\Teil der Nachricht: Es ist eine visuelle Darstellung des von Ihnen eingegebenen Zeichens, und das Terminal befindet sich im Kochmodus und mit aktiviertem Echo (Zeichen werden vom Terminal angezeigt, sobald Sie sie eingeben, im Gegensatz zu Nicht-Echo-Modus, in dem die Zeichen nur an die Anwendung gesendet werden, die sie möglicherweise nicht anzeigt. Der QuitTeil stammt von bash: Es stellt fest, dass sein untergeordneter Prozess aufgrund eines Beendigungssignals gestorben ist, und auf diese Weise werden Sie darüber informiert.

Shells verarbeiten alle gängigen Signale. Wenn Sie also ^ \ in eine Shell eingeben, wird Ihre Sitzung nicht beendet. Sie erhalten lediglich eine neue Eingabeaufforderung, die mit ^ C identisch ist.

Mit dem sttyBefehl können Sie mit den Terminaleinstellungen spielen .

¹ Und generieren traditionell einen Core-Dump , aber viele Systeme deaktivieren dies heutzutage standardmäßig.

Gilles 'SO - hör auf böse zu sein'
quelle
SIGINT beendet die Vordergrundprozessgruppe und SIGQUIT beendet sie mit einem Core-Dump. Beide Signale können verarbeitet werden. Ich bin mir nicht sicher, was Sie damit meinen, wenn Sie den nächsten Befehl lesen . Systeme deaktivieren Core-Dumps nur, indem Sie das anfängliche Coredumpsize-Limit auf 0 setzen (nicht das harte, Sie können es generell erhöhen).
Stéphane Chazelas
@ StéphaneChazelas In einem Programm, das Benutzerinteraktionen ausführt, besteht die übliche Semantik von SIGINT darin, den aktuellen Benutzerbefehl abzubrechen und dem Benutzer die Interaktion mit dem Programm zu ermöglichen, dh zur Hauptbefehlsschleife zurückzukehren. Andererseits kann ich mich nicht erinnern, ein Programm gesehen zu haben, bei dem SIGQUIT nicht beendet wurde (abgesehen von Fehlern im Signalhandler). In der Tat deaktivieren viele Systeme Core-Dumps standardmäßig, indem sie das Soft-Limit für die Core-Dump-Größe auf 0 setzen, sodass Benutzer diese Standardeinstellung nach Belieben ändern können.
Gilles 'SO- hör auf böse zu sein'
Das ist die Ausnahme. SIGINT bricht die aktuell ausgeführte Aufgabe ab. Nur wenige Anwendungen würden dies erweitern, um ihre eigene "Vordergrund" -Aufgabe zu beenden. Sie müssen an lessoder denken vim. Beachten Sie, dass in cmd | less, CTRL-Ctötet nicht im Allgemeinen cmd(während für less(Fortsetzung) wird die aktuelle Aktion abzubrechen (wie eine Suche) behandelt wird )
Stéphane Chazelas
Ich finde den Wortlaut Ihrer Antwort in dieser Hinsicht verwirrend. Die Tatsache, dass SIGQUIT im Allgemeinen nicht behandelt wird, ist, dass es nicht auf die gleiche Weise verwendet wird. Sie drücken STRG-C, um den aktuellen Vorgang abzubrechen. Sie verwenden STRG- nur gelegentlich zum Debuggen, um einen Core-Dump zu generieren. Es gibt im Allgemeinen keinen Grund, warum eine Anwendung Sie daran hindern möchte, dies zu tun.
Stéphane Chazelas
@ StéphaneChazelas Nicht nur weniger und vim, die meisten terminalbasierten Anwendungen, die Benutzerbefehle dazu lesen. Zum Beispiel REPL (Bash, Dash, Ksh, Zsh, Python, Irb, Fsharpi, Mathematica, ...). Es ist kaum ungewöhnlich. Ihr erster Kommentar widerspricht dem Malen von SIGINT und SIGQUIT als zu unterschiedlich und Ihr letzter Kommentar widerspricht dem Malen von SIGINT und SIGQUIT als zu ähnlich, was mich verwirrt, was Sie anstreben.
Gilles 'SO - hör auf böse zu sein'
7

Zusätzlich zu Gilles Antwort möchte ich hinzufügen, dass Sie in bash immer nicht druckbare Zeichen mit Ctrl-v+ key( in diesem Fall Ctrl-v+ Ctrl+4) eingeben und den Zeichencode mit überprüfen können

$ printf '^\' | od -An -tu    # input ^\ as C-v C-4
28

Sie erhalten den Dezimalcode des Zeichens, der beim Einchecken man asciidem Dateitrennzeichen (FS) entspricht .

jimmij
quelle
Was macht Strg + V? Ich bin daran gewöhnt, "Zwischenablage einfügen" zu sein.
JDługosz
2
@ JDługosz: Strg-V weist das Terminal an , das folgende Zeichen nicht zu interpretieren. Es ist eine bedauerliche Tatsache, dass GUI-Tastenkombinationen diese Steuerzeichen übernommen haben und unnötige Verwirrung stiften. Früher verwendete Linux Alt- [Taste] für die GUI-Tasten (z. B. Alt-C / Alt / V zum Kopieren / Einfügen), aber dann dachten die Leute offensichtlich, es sei wichtiger, dasselbe wie Windows zu tun. Mittlerweile haben Mac-Benutzer immer noch kein Problem damit, die Befehlstaste anstelle der Strg-Taste für diese Vorgänge zu verwenden.
Celtschk
Der (kürzere) Befehl lautet printf '%d\n' '"^\':?
Isaac