Befehlszeileneingabe, während ein laufendes Skript seltsame Symbole anzeigt

8

Wenn ich die Bash-Shell-CLI verwende und ein Programm ausführe, das nicht sofort zurückkehrt, gebe ich einige Buchstaben ein (im Grunde tippe ich den nächsten Befehl, bevor ich bemerke, dass der vorherige nicht beendet wurde) und die Eingabe sieht immer ungefähr so ​​aus (besonders bei Verwendung Pfeiltasten nach oben und unten :)

]]A^ or ]]B^

Und ich frage mich, ist diese Art der vorzeitigen Eingabe überhaupt "schädlich", oder was bedeutet die zurückgegebene Zeichenfolge?

U2ros
quelle
1
Dies ist nicht spezifisch für Bash, ich würde dieses Tag entfernen.
Didi Kohen

Antworten:

8

Diese Zeichenfolgen sind die Rohdarstellung der von Ihnen eingegebenen Sonderzeichen (wie Home, End, Pfeile, Tabulatoren usw.).
Ihre schädliche Wirkung wird durch den von Ihnen ausgeführten Befehl gesteuert. Wenn er Eingaben vom Terminal empfängt, sind diese Zeichen Teil seiner Eingabe.
Wenn keine Eingabe vom Terminal erfolgt, sollte dies keine nachteiligen Auswirkungen auf die mir bekannten Unix-Varianten haben.

Didi Kohen
quelle
13

Einige Tasten auf Ihrer Tastatur entsprechen nicht den tatsächlichen Zeichen. Entspricht beispielsweise Adem Zeichen, aaber die Tasten Upund F1haben keine eigenen Zeichen. Wenn diese Sondertasten gedrückt werden, übersetzt das Terminal den Tastendruck in eine spezielle Folge von mehreren Zeichen, die normalerweise mit dem Escape-Zeichen beginnen (normalerweise angezeigt als ^[) , anstatt ein einzelnes Zeichen zu erhalten, das der Taste entspricht . UpGeneriert beispielsweise normalerweise die Sequenz ^[[A(das sind 3 Zeichen aus einer Taste: Escape ,, [und A).

Der Grund, den Sie normalerweise nicht sehen, ^[[Aist, dass die meisten Konsolenanwendungen intelligent genug sind, um die speziellen Sequenzen in nützliche Befehle zu übersetzen, anstatt sie nur auf die Konsole zu übertragen. Zu diesem Zweck schalten sie das integrierte Echo des Terminals aus und führen ihre eigene Verarbeitung auf niedrigerer Ebene durch. Wenn Sie beispielsweise bashsehen ^[[A, ¹ wird Ihnen klar, dass Sie gedrückt haben, Upund anstatt ^[[Azurückzuspielen, werden eine ganze Reihe von Aufgaben ausgeführt, um alles zu löschen, was Sie bisher eingegeben haben, den zuvor im Verlauf gespeicherten Befehl abzurufen und diesen stattdessen auszudrucken.

Wenn Sie ^[[Abeim Drücken sehen Up, bedeutet dies normalerweise, dass das Terminal-Echo aktiviert ist und der Vordergrundprozess (derjenige, der das Terminal steuert) keine der oben genannten speziellen Verarbeitungen ausführt. Dies kann daran liegen, dass die Anwendung das Terminal einfach ignoriert (wie die meisten nicht interaktiven Befehle). Beachten Sie, dass die Shell das Terminal normalerweise in den kanonischen Modus versetzt und das Echo aktiviert, bevor ein Vordergrundprozess ausgeführt wird, und seine eigenen Einstellungen wiederherstellt, sobald es nach dem Beenden des Befehls die Kontrolle über das Terminal wiedererlangt.

Das Echo scheint ziemlich harmlos. Denken Sie daran, dass die Zeichen, die Sie über die Tastatur generiert haben, wahrscheinlich in bashder Eingabewarteschlange landen, wenn der laufende Befehl nicht vom Terminal gelesen wird. Seien Sie also vorsichtig, was Sie eingeben, da sie wahrscheinlich als normale Befehle interpretiert werden, sobald bashdas Lesen fortgesetzt wird vom Terminal.

¹ Dies ist eigentlich eine Vereinfachung. Da die spezifische Reihenfolge je nach Terminaltyp variieren kann, befinden sich normalerweise mehrere Ebenen von Abstraktionsbibliotheken zwischen einer Konsolenanwendung und dem Terminal selbst. Zum Beispiel bashverwendet die readlineBibliothek die meisten seiner Eingabe zu tun.

jw013
quelle
1
Nach dem, was ich aus der Frage verstanden habe, war der Fall hier während der Ausführung eines anderen Befehls und nicht in der silbernen Zeit zwischen dem Beenden des Prozesses und bevor Bash die Terminaleinstellungen wiederherstellte. Ich habe Ihre Antwort jedoch positiv bewertet, da sie den Fall im Detail erklärt, im Gegensatz zu meiner Antwort, die das absolute Minimum darstellt, das zur Beantwortung erforderlich ist.
Didi Kohen
@ DavidKohen Ich denke, Sie haben Recht mit der ursprünglichen Frage. Ich habe meine Antwort ein wenig angepasst, um zu berücksichtigen, wann der Befehl noch ausgeführt wird.
jw013