Ich habe ein Problem, bei dem das Terminal, wenn ich sehr lange Befehle in Bash eingebe, nicht das wiedergibt, was ich richtig eingebe. Ich würde das erwarten, wenn ich einen Befehl wie den folgenden hätte:
username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com
Der Befehl sollte in zwei Zeilen gerendert werden. Stattdessen wird es oft herumlaufen und anfangen, über meine Eingabeaufforderung zu schreiben, in etwa wie folgt:
myreallylongusername@something.somelongserver.comh -i /path/to/private/key
Wenn ich mich entscheide, ein Argument zu ändern, kann ich nicht sagen, wo der Cursor angezeigt wird, manchmal in der Mitte der Eingabeaufforderung, aber normalerweise in der Zeile über der Eingabe.
Zusätzlichen Spaß macht es, wenn ich Upzu einem vorherigen Befehl komme. Ich habe dies sowohl im Gnome-Terminal als auch im Terminator und auf i3 und Cinnamon ausprobiert. Jemand schlug vor, es sei meine Aufforderung. Hier also:
\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
Ctrll,, reset
und clear
alle tun, was sie sagen, aber wenn ich den Befehl wieder eingebe oder Updas Gleiche passiert.
Ich habe es überprüft und es checkwinsize
ist in Bash aktiviert. Dies passiert bei 80x24 und anderen Fenstergrößen.
Ist das nur etwas, womit ich leben lerne? Gibt es ein Stück Magie, das ich wissen sollte? Ich habe mich entschlossen, nur eine kurze Eingabeaufforderung zu verwenden, aber das behebt das Problem nicht.
env -i bash --norc
behebt das Problem. Die $ COLUMNS und $ LINES stimmen überein. Bedeutet das, dass mit meiner .bashrc etwas Komisches passiert?\[\033[01;32m\]\u: \[\033[01;34m\]\W \[\033[01;34m\] \$ \[\033[0m\]
scheint die Verrücktheit im Verhalten zu vermeiden - aber weiß nicht, ob es Ihre ursprüngliche Aufforderung vollständig respektiert ...tput smam
Antworten:
Nicht druckbare Sequenzen sollten in
\[
und eingeschlossen sein\]
. Wenn du auf deine PS1 schaust , hat sie eine nicht geschlossene Sequenz\W
. Der zweite Eintrag ist jedoch redundant und wiederholt die vorherige Anweisung "1; 34" .Als solches sollte dies die beabsichtigte Färbung haben:
Unter Beibehaltung des "Originals" sollte dies auch funktionieren:
Bearbeiten:
Der Grund für das Verhalten liegt in
bash
der Annahme, dass die Eingabeaufforderung länger ist als sie tatsächlich ist. Als einfaches Beispiel, wenn man verwendet:Es wird angenommen, dass die Eingabeaufforderung aus 8 Zeichen und nicht aus 1 besteht. Wenn das Terminalfenster 20 Spalten umfasst, wird nach Eingabe von 12 Zeichen angenommen, dass es 20 Zeichen enthält, und es wird umbrochen. Dies zeigt sich auch, wenn man dann versucht, Backspace oder Ctrl+u. Es stoppt bei Spalte 9.
Es wird jedoch auch keine neue Zeile gestartet, es sei denn, eine Zeile befindet sich in der letzten Spalte. Infolgedessen wird die erste Zeile überschrieben.
Wenn Sie die Eingabe fortsetzen, sollte die Zeile nach 32 Zeichen in die nächste Zeile umgebrochen werden.
quelle
Dies hängt hauptsächlich mit der Größe des Fensters zusammen, von dem das Terminal annimmt, dass es nicht mit Ihrer tatsächlichen Fenstergröße übereinstimmt. Wenn Sie Bash verwenden, können Sie dies versuchen.
Wenn Sie nicht bekommen
Dann aktivieren Sie es mit
Versuchen Sie dann einfach, einen anderen Befehl (wie
ls
) auszuführen oder die Fenstergröße einmal zu ändern. Das oben Genannte funktioniert bei mir jedes Mal.Für Redhat Systeme Insbesondere wird das Problem oft durch Fehlkonfiguration
~/.bashrc
nicht zu nennen/etc/bashrc
. Normalerweise werden Bash-Ladevorgänge~/.bashrc
aufgerufen/etc/bashrc
, die standardmäßig enthalten sindshopt -s checkwinsize
.quelle
/etc/bashrc
. Alles andere war in Ordnung. Es stellte sich heraus, dass dies die Ursache für die Umbruchprobleme ist.shopt -s checkwinsize
in der SSH-Sitzung ausgeführt. Aber die Verpackung bleibt bestehen.Wie bereits in anderen Antworten erwähnt, sollten nicht druckbare Sequenzen
\e[0;30m
mit eingeschlossen werden\[...\]
.Zusätzlich (und was ich noch nicht erwähnt sehe) scheint es, dass
\r\n
es außerhalb von liegen sollte,\[...\]
wenn Sie eine mehrzeilige Eingabeaufforderung haben. Ich brauchte ein bisschen Versuch und Irrtum, um das endlich herauszufinden.quelle
Ich habe einmal irgendwo gelesen (ich weiß nicht mehr wo), dass ich dieses Problem mit
\001
und\002
anstelle von\[
und\]
lösen kann. Es hat für mich getan.Übrigens muss die Definition von PS1 nicht hässlich aussehen.
quelle
Das klingt wie ein Problem mit Ihrer
COLUMNS
&LINES
Einstellung der Umgebungsvariablen. Wenn Sie die Größe des Fensters ändern, werden sie normalerweise automatisch von gnome-terminal festgelegt (ich glaube). Sie können die manuelle Festlegung erzwingen, indem Sie den Befehl ausgebenresize
.Beispiel
Wenn ich mein Gnome-Terminal auf 79x17 verkleinere, werden meine Variablen folgendermaßen angezeigt:
Ich kann es so erzwingen:
quelle
Um ein Umbrechen zu verhindern, können Sie auch die Anzahl der Spalten erhöhen, indem Sie z
quelle
Dasselbe Problem kann auch durch die Verwendung von breiten Unicode-Symbolen verursacht werden (z. B. von https://stackoverflow.com/a/34812608/1657819 ). Hier ist das Snippet das Problem verursacht (etwas dagegen die
$Green
und$Red
richtig Farbe Saiten entkam):Bash kann die Länge nicht korrekt berechnen. Der einfachste Weg ist, 2 von 3 Teilen dieser breiten Symbole zu maskieren.
quelle
\001
und umgeht\002
.