Hash-Symbole (#) wurden zu Pfund-Symbolen (£), nachdem eine Binärdatei gezählt wurde


42

So sah meine Bash-Eingabeaufforderung früher aus.

alte Bash-Eingabeaufforderung

Dann habe ich etwas gemacht, was wahrscheinlich nicht so klug war cat /bin/bash. Und jetzt sieht meine Bash-Eingabeaufforderung so aus, mit einem Pfund-Symbol (£) anstelle eines Hash-Symbols (#). Es wirkt sich sogar auf Hash-Symbole in Dateien aus, siehe hier:

Pfund-Symbole in Dateien

Irgendeine Idee, wie man das zurücksetzt?

Bearbeiten: Diese Frage lautet nicht "Wie ändere ich meine Bash-Eingabeaufforderung?", Sondern "Meine Bash-Eingabeaufforderung hat sich von selbst geändert. Wie kann ich sie wiederherstellen?"

Komplett.bashrc für Interessierte.



1
(Ich habe mir
erlaubt,

9
Die Aufforderung, Datei usw. noch den Zeichencode enthalten für #, \x23; Es ist nur so, dass das Terminal jetzt \x23als interpretiert £.
DeltaB

4
Der interessante Teil ist, dass "Pfund" ein anderer Name für das Hash-Symbol in amerikanischem (und möglicherweise auch anderen Nationalitäten?) Englisch ist ... =)
jpmc26

1
In welchem ​​Terminalprogramm wurde das gemacht?
SnoringFrog

Antworten:


102

Das Terminal akzeptiert und führt eine Reihe verschiedener Zeichenfolgen als Steuerbefehle aus. Zum Beispiel werden alle Cursorbewegungen mit diesen ausgeführt. Einige der Codes führen permanente Änderungen durch, z. B. das Festlegen von Farben oder die Aufforderung an das Terminal, einen alternativen Zeichensatz zu verwenden. Ausführbare Dateien und andere Binärdateien können durchaus Bytes enthalten, die diese Befehle darstellen, sodass das Ablegen von Binärdateien auf dem Terminal lästige Nebenwirkungen haben kann. Siehe zB hier für einige der Steuercodes.

Der historische Hintergrund hierfür ist, dass Terminals ursprünglich eher dumme Geräte mit einem Bildschirm und einer Tastatur waren und über eine serielle Schnittstelle mit dem eigentlichen Computer verbunden waren. Davor waren sie Drucker mit Tastaturen. Es gab nicht viel von einem Protokoll, um Datenbytes von Befehlsbytes zu trennen, so dass Befehle an das Terminal "inline" gegeben wurden. (Oder besser gesagt, die Escape-Codes und Steuerzeichen waren das Protokoll.) Man könnte davon ausgehen, dass es eine klarere Trennung zwischen Daten und Befehlen geben würde, wenn das System heute entwickelt worden wäre.

Anstatt nur das Terminalfenster zu schließen oder den Emulator zu beenden , können Sie den resetBefehl verwenden , der einen ähnlichen Befehl (oder mehrere) sendet, um das Terminal auf die normalen Standardeinstellungen zurückzusetzen.

Ich weiß nicht, was genau dazu führen würde, dass sich der Hash ändert. (Aber @ Random832 tut, sehen ihre Antwort .) Ich bin mehr vertraut mit dem „alternativen Zeichensatz“, die alle Zeichen in Strichzeichnungs Glyphen ändern können. Selbst wenn dies passiert, werden Eingaben über die Tastatur normalerweise unverändert ausgeführt, sodass das Schreiben resetEnterauch dann noch funktioniert, wenn die Zeichen als Müll angezeigt werden oder gar nicht. (Im Vergleich dazu, dass Ihre Eingabeaufforderung in ein Bündel von Zeilen umgewandelt wurde, haben Sie nur einen geringen Effekt.)


1
Vielen Dank für die ausführliche Erklärung. Ich werde abstimmen, sobald ich den nötigen Ruf habe.
Lhermann

2
Als ich zum ersten Mal cat /dev/urandomdie Debian-Installationskonsole ausprobierte (Bildschirmauflösungen, die an gemauerte Hardware denken), dachte ich, ich hätte einen Überlauf ausgelöst und navigierte schnell zu der Schaltfläche "Alle Änderungen verwerfen, Maschine neu starten". Jetzt weiß ich, dass es sich um eine "beabsichtigte Funktion" handelt.
wizzwizz4

2
Es ist eine historisch gewollte Funktion, die jetzt unerwünscht ist. Einige (alles gute) Terminal-Emulatoren sollten das Deaktivieren der alten Zeichensatzumschaltung verhindern, wenn sie in einer UTF-8-Umgebung ausgeführt werden. Ob dies jedoch der Fall ist und wie Sie die Option aktivieren, ist nicht ausreichend dokumentiert variiert.
R ..

78

Um zu beantworten, warum dies passiert ist und wie es behoben werden konnte, ohne das Terminal zu schließen (und falls dies resetfehlschlug):

Viele Terminals unterstützen als Merkmal der emulierten VT220- Terminals eine Reihe nationaler Ersatzzeichensätze, die auf ISO 646 und ISO 2022 basieren . Insbesondere ist es aus bestimmten Gründen, auch wenn die anderen nicht unterstützt werden, sehr verbreitet, dass sie den britischen Zeichensatz unterstützen, bei dem das Pfund-Währungssymbol an derselben Stelle steht, an der ASCII das Nummernzeichen hat.

Wenn Sie also eine Binärdatei auf das Terminal drucken, gibt sie zufällig die Sequenz ESC ( A[oder vielleicht ESC ) Aund ^N] auf das Terminal aus. Dies kann manuell rückgängig gemacht werden, indem die Sequenz gedruckt wird, die den normalen Status angibt:

printf '\e(B\e)0\x0f'

Ich habe so etwas erraten, ohne die Einzelheiten zu kennen. Vielen Dank für die Erklärung. Wie großartig, Leute wie Sie in der Nähe zu haben!
Lhermann

1
Oh je, die Möwen anstelle von Ä und Ö ... und Terminal auf OS X unterstützt diesen Ersatz sogar im Jahr 2016. Wenn ich nur noch eine Gegenstimme hätte.
Ilkkachu

@ilkkachu Einige Terminals, die sie ansonsten unterstützen (ich kenne Putty und ich denke auch die Linux-Konsole), lehnen sie ab, wenn UTF-8 verwendet wird, da ISO 2022 besagt, dass andere Sequenzen (außer ESC % @) im Status nicht unterstützt werden sollen Damit wird UTF-8 unterstützt. Sie werden möglicherweise irgendwann ausgeblendet, wenn mehr Anwendungen gezwungen sind, UTF-8 für das Strichzeichnen zu verwenden. Dies ist die am häufigsten verwendete tatsächliche Verwendung dieser Funktion. Die anderen Zeichensätze werden meistens eingeschlossen, da sie "kostenlos" sind, wenn Sie den Mechanismus implementiert haben ].
Random832

20
Es ist leicht, sich an diese Fluchtsequenzen zu erinnern: "A" steht für britisch, "B" steht für "amerikanisch": D
egmont

8
@egmont Wie sich herausstellt, habe ich mich damit befasst. Sie werden der Reihe nach in der Reihenfolge zugewiesen, in der sie bei der ISO registriert wurden. Die erste ist die alte internationale Referenzversion [mit ¤für $] ist @, und dann ist die britische Version vor der amerikanischen reingekommen. itscj.ipsj.or.jp/itscj_english/index.html für eine Liste aller von ihnen.
Random832

30

Schließen Sie das Terminal und öffnen Sie ein neues.


19
Das solltest du nicht. Die Frage ist gültig. Vielleicht wird jemand erklären, warum dies im Detail passiert ist. Dies muss ein Loch in Bash sein. £Befindet sich unter dem gleichen Schlüssel, mit dem #nur aufgerufen wird Alt. Irgendwie Altblieb das in Bash. Wie auch immer, Sie können auf eine richtige Erklärung warten oder wenn Sie mit meiner Antwort zufrieden sind, klicken Sie auf das Häkchen, um sie zu akzeptieren.
Tomasz

1
Oder doch lieber nicht in Bash, sondern im Terminalprogramm. Ich habe dasselbe auf einer Befehlszeile außerhalb der GUI versucht und es wird für immer wiederholt.
Tomasz

5
@Xalorous, die Frage besagt , dass das Problem auftrat , wenn er cated /bin/bashzum Terminal.
Ilkkachu

2
Random832 gab eine gute Erklärung, was tatsächlich passiert ist
Lhermann

16
Das ist übertrieben - was ist, wenn Sie in Ihrer Sitzung einen Zustand haben, den Sie beibehalten möchten? Was ist, wenn es sich eher um eine Konsole als um ein X-Terminal handelt? resetist das richtige Werkzeug für den Job.
Pericynthion


9

stty saneschien das Problem zu beheben und resettat es auch.


7

Es ist nicht erforderlich, Ihr Terminal zu schließen und erneut zu öffnen oder zurückzusetzen! Obwohl das Zurücksetzen funktioniert, ist dies nicht der richtige Weg!

Sie müssen nur den Scrollback- Puffer des Terminals löschen . Verwenden Sie dazu einfach den folgenden Befehl:

$ echo -ne '\0033\0143'

1
Haben Sie eine Erklärung für dieses Wunder?
Tomasz

1
@ Thomas Ja Kumpel sicher. Wenn -eaktiviert, werden einige Sequenzen erkannt, die Sie lesen können. man echoEine davon \0NNNsteht für Byte mit dem Oktalwert NNN. Tatsächlich müssen Sie Ihre Terminalsitzung nicht zurücksetzen, sondern nur Ihren Scrollback-Puffer LÖSCHEN. Und der Befehl, den ich sagte, erledigt den erforderlichen Job. Wenn Sie beispielsweise MacOS X verwenden, gibt es eine Menüleiste Bearbeiten in, während Sie das Terminal verwenden, und es gibt eine Option wie "Scrollback löschen" oder "K".
FarazX

5
Die Sequenz \033\143lautet ESC c, Reset to Initial State : "Setzen Sie den VT100 in seinen Ausgangszustand zurück, dh in den Zustand, den er nach dem Einschalten hat. Dadurch werden auch der Einschalt-Selbsttest und das Signal INIT H to ausgeführt kurz geltend gemacht werden. "
DeltaB

1
@deltab Ich habe vergessen, über ESC zu erwähnen, danke eine Million Kumpel.
FarazX

1
@tomas Wenn Sie versuchen, eine Datei anzuzeigen, die nicht angezeigt werden soll - zum Beispiel Binärdateien -, verhält sich das Terminal seltsam und umständlich. Viele Linux-Benutzer führen das Zurücksetzen durch, aber dies ist nicht die beste Option, da keine Terminalsitzung zurückgesetzt werden muss und das Löschen des Scrollback-Puffers erforderlich ist.
FarazX
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.