Bash scheint im Spezialmodus zu sein

Bash scheint im Spezialmodus zu sein

System: Debian 8 mit XFCE, Cli: Konsole Version 2.14.2 (Das Terminal heißt "Konsole" ->https://konsole.kde.org/)

Ein Freund bat mich, ihm bei einem seltsamen Problem zu helfen.

Einige Tasten verhalten sich merkwürdig.

Beispielsweise Shift + §wird nur die aktuelle Zeile angezeigt (arg: 0)(Wir haben eine Schweizer Tastaturhttps://en.wikipedia.org/wiki/QWERTZ#/media/File:KB_Swiss.svg, diese Taste finden Sie oben links)

Durch Drücken övon wird angezeigt (arg: 6). Und so weiter...

Ich kann diesen „Modus“ durch die folgenden Befehle verlassen:

set -o vi
set +o vi

Aber ich bin vorher nicht im vi-Modus. Soweit ich das beurteilen kann. Aber irgendetwas scheint "zurückgesetzt" zu sein. Die Sache ist, dass ich auch einige Einstellungen verliere, die ich haben möchte, wenn ich die beiden obigen Befehle verwende.

BEARBEITEN:Was ich vergessen habe zu erwähnen: Auf einem anderen Terminalemulator UXTermist das Verhalten „normal“. Also so, wie ich es will. Aber in XTermhabe ich das gleiche Verhalten wie in Konsole.

EDIT2:Wie gewünscht:

user@myMachine:~$ bind -p | grep arg
"\M--": digit-argument
"\M-0": digit-argument
"\M-1": digit-argument
"\M-2": digit-argument
"\M-3": digit-argument
"\M-4": digit-argument
"\M-5": digit-argument
"\M-6": digit-argument
"\M-7": digit-argument
"\M-8": digit-argument
"\M-9": digit-argument
"\M-.": insert-last-argument
"\M-_": insert-last-argument
# universal-argument (not bound)
# vi-arg-digit (not bound)
# vi-yank-arg (not bound)
"\M-.": yank-last-arg
"\M-_": yank-last-arg
"\M-\C-y": yank-nth-arg
bioinf@ags-wav-debian-MandS:~$ set +o emacs
bioinf@ags-wav-debian-MandS:~$ bind -p | grep ö
bash: bind: warning: line editing not enabled

Zusätzliche Information:

user@machine:~$ locale charmap
ANSI_X3.4-1968

user@machine:~$ bind -v | grep meta
set convert-meta on
set enable-meta-key on
set input-meta on
set meta-flag on
set output-meta on

Antwort1

Es scheint alles darauf hinauszulaufen, dass der Zeichensatz in Ihrer Region ASCII ist. ASCII ist ein amerikanischer Zeichensatz aus den 60er Jahren und das ist der gemeinsame Nenner für die meisten modernen Zeichensätze.

Dies geschieht normalerweise, wenn die Gebietsschemas nicht konfiguriert sind (Umgebungsvariablen LANG und LC_* alle nicht festgelegt) oder wenn sie auf Coder festgelegt sind POSIX.

Dieser Zeichensatz definiert 128 Zeichen mit Bytewerten von 0 bis 127. Alle Zeichen, aus denen die Sprache sh besteht und die in den meisten Befehlsnamen vorkommen, sind ASCII-Zeichen. § und ° hingegen nicht.

Jetzt befinden sich diese Symbole auf Ihrer Tastatur. Was sollte passieren, wenn Sie sie in einen Terminalemulator eingeben?

Wenn Sie Ihren Terminalemulator in einem Gebietsschema starten, in dem der Zeichensatz ASCII ist, teilen Sie Ihrem Terminalemulator mit, dass er beim Drücken von A, ( XK_aX11-Tastendruckereignis) die Kodierung des aZeichens in der ASCII-Kodierung senden muss, also 0x61. Wenn Sie jedoch Shift+§( XK_degreeX11-Tastendruckereignis) drücken, sollte er die Kodierung für das °-Zeichen senden, aber es gibt kein solches Zeichen in ASCII. Was soll er also tun?

xtermund rxvtwählen Sie die Kodierung °im Zeichensatz ISO-8859-1. Das ist der 8-Bit-Zeichensatz der meisten westlichen Länder (erweitert ASCII, um die meisten Zeichen abzudecken, die in Sprachen wie Deutsch, Französisch, britischem Englisch, Spanisch usw. verwendet werden). Vor UTF-8 war das der am häufigsten verwendete Zeichensatz.

Mein konsole, Etermund xfce4-terminalsenden Sie ?für jedes Nicht-ASCII-Zeichen.

Mein Gnome-Terminal und Terminator senden die UTF-8-Kodierung von °.

Was soll es tun, wenn bashes die ISO8859-1-Kodierung °(0xb0) wie in empfängt xterm?

Wir haben ihm mitgeteilt, dass der Zeichensatz ASCII sei, sodass 0xb0 keinem bekannten Zeichen entspricht.

Früher Ctrl+Xwurde in den USA verwendet, um Zeichen von 0 bis 31 einzugeben (die Steuerzeichen). In ASCII würden dadurch die unteren 5 Bits des entsprechenden Zeichens gesendet. Wenn beispielsweise , A, 0x410x61 und 0x1f gesendet würden, also 0x1 (das a, auch bekannt als CA-Zeichen). Während würde die Kodierung von mit dem gesetzten 8. Bit gesendet. Wenn , , würde 0x61 | 0x80 gesendet, also 0xe1. Wenn Sie drücken, würden 0x30 | 0x80 gesendet, also 0xb0, auch bekannt als M-0-(Nicht-)Zeichen.0x61Ctrl+A^AMeta+Xxa0x61Meta+AMeta+0

In ASCII wurden aus der Zeit der Fernschreiber die Zeichen 0x0 -> 0x1f als Steuerzeichen verwendet. Die meisten dieser Zeichen werden nicht mehr verwendet. 0x80 bis 0xff werden nicht verwendet. Dies war also eine Möglichkeit, Codes einzugeben, mit denen man auch andere Dinge als die Texteingabe machen konnte. Emacs verwendete diese beispielsweise für die Bearbeitungstasten. Das C-BZeichen bewegt den Cursor ein Zeichen nach links, das M-B(Nicht-)Zeichen bewegt den Cursor ein Wort nach links.

Da heutzutage die meisten Leute Zeichensätze verwenden, die ASCII erweitern, indem sie die Bytewerte 0x80 bis 0xff verwenden, werden diese im Allgemeinen nicht mehr als Metazeichen verstanden. Meta+Xsendet jetzt stattdessen im Allgemeinen zwei Zeichen: die Zeichen ESC und X.

Wenn Sie sich jedoch in einem Gebietsschema befinden, in dem die Bytewerte 0x80 bis 0xff unmöglich Zeichen sein können, und bash(tatsächlich readline) einen Bytewert wie 0xb0 vom TTY-Gerät lesen, versteht es diesen als M-0 (was standardmäßig an gebunden ist digit-argument, was Ihr erklärt arg: 0).

Das ist die convert-metaEinstellung in der Readline-Konfiguration. In der Readline-Dokumentation ( ) finden Sie, man 3 readlinedass Readline, wenn es erkennt, dass der Zeichensatz 7 Bit ist, diesen so einstellt, dass ondiese 0xb0 Bytes in ESC + 0 konvertiert werden.

Wenn Sie das ausschalten mit:

bind 'set convert-meta = off'

(und vorausgesetzt input-meta, und output-metasind auch on). Dann werden Sie feststellen, dass durch Drücken °ein angezeigt wird °. Dies wäre jedoch eine 0xb0-ISO8859-1-Kodierung, mit °der Anwendungen nichts anfangen können.

Sie müssen das Gebietsschema auf ein Gebietsschema festlegen, das diese °Zeichen enthält. Heutzutage sollten Sie nur UTF-8 in Betracht ziehen, da dieses alle Zeichen abdeckt und weithin unterstützt wird.

Überprüfen Sie daher Ihre Desktopkonfiguration auf Ihre Internationalisierungseinstellungen und wählen Sie etwas wie de_CH.UTF-8/ fr_CH.UTF-8/ it_CH.UTF-8(deutsch/französisch/italienischsprachige Schweizer mit UTF-8 als Zeichensatz), das am besten zu Ihrer Umgebung passt.

Damit dies vollständig berücksichtigt wird, müssen Sie sich möglicherweise ab- und erneut anmelden.

Bei einigen Anmeldemanagern können Sie das Gebietsschema beim Anmelden manchmal auch über ein Dropdown-Menü auswählen.

verwandte Informationen