Etwas, das ich in Ubuntu seit langem bemerkt habe und das mich frustriert hat, ist, wenn ich einen Befehl in der Befehlszeile eingebe, der länger (breiter) als die Terminalbreite ist, anstatt in eine neue Zeile zu brechen Spalte 1 in derselben Zeile und überschreibt den Anfang meiner Befehlszeile. (Der eigentliche Befehl wird nicht überschrieben, aber der angezeigte Text wird visuell überschrieben.)
Es ist schwer zu erklären, ohne es zu sehen, aber nehmen wir an, mein Terminal war 20 Zeichen breit (meins ist mehr wie 120 Zeichen - nur zum Beispiel), und ich möchte das englische Alphabet wiederholen. Was ich tippe ist das:
echo abcdefghijklmnopqrstuvwxyz
Aber wie mein Terminal aussieht, bevor ich die Taste drücke, ist:
pqrstuvwxyzghijklmno
Wenn ich die Eingabetaste drücke, ertönt ein Echo
abcdefghijklmnopqrstuvwxyz
Ich weiß also, dass der Befehl ordnungsgemäß empfangen wurde. Es hat meine Eingabe nach dem "o" einfach umbrochen und in derselben Zeile von vorne begonnen.
Was ich erwarten würde, wenn ich diesen Befehl auf einem Terminal mit einer Breite von nur 20 Zeichen eingeben würde, wäre dies:
echo abcdefghijklmno
pqrstuvwxyz
Hintergrund: Ich verwende bash als Shell und habe diese Zeile in meinem ~ / .bashrc:
set -o vi
in der Befehlszeile mit VI-Befehlen navigieren zu können. Ich verwende derzeit Ubuntu 10.10 Server und verbinde mich mit dem Server mit Putty.
In jeder anderen Umgebung, in der ich gearbeitet habe, wird, wenn ich eine lange Befehlszeile eingebe, eine neue Zeile unter der Zeile eingefügt, in der ich gerade arbeite, wenn mein Befehl länger als die Terminalbreite ist und wenn ich weiter tippe, kann ich meinen Befehl sehen 2 verschiedene Zeilen. Aber solange ich mich erinnern kann, Ubuntu verwendet zu haben, belegen meine langen Befehle nur 1 Zeile.
Dies passiert auch, wenn ich zu vorherigen Befehlen im Verlauf zurückkehre (ich drücke Esc, dann 'K', um zu vorherigen Befehlen zurückzukehren) - wenn ich zu einem vorherigen Befehl komme, der länger als die Terminalbreite war, wird die Befehlszeile aufgerufen verstümmelt und ich kann nicht sagen, wo ich im Befehl bin.
Die einzige Abhilfe, die ich gefunden habe, um den gesamten langen Befehl zu sehen, ist das Drücken von "Esc-V", wodurch der aktuelle Befehl in einem VI-Editor geöffnet wird.
Ich glaube nicht, dass ich etwas Seltsames in meiner .bashrc-Datei habe. Ich habe die Zeile "set -o vi" auskommentiert und hatte immer noch das Problem.
Ich habe eine neue Version von Putty heruntergeladen und keine Änderungen an der Konfiguration vorgenommen. Ich habe nur meinen Hostnamen eingegeben, um eine Verbindung herzustellen, und ich habe immer noch das Problem einige Konfigurationsänderungen vornehmen)
Hat jemand anderes dieses Problem gehabt und kann sich jemand vorstellen, wie man es behebt?
Bearbeiten
Es war meine .bashrc-Datei. Ich habe das gleiche Profil von Computer zu Computer kopiert und Sonderzeichen in meiner PS1 verwendet, die es irgendwie abschrecken. Ich halte mich jetzt an die Standard-Bash-Variablen für meine PS1.
Danke an @ ændrük für den Tipp zum .bashrc!
... Bearbeiten beenden ...
quelle
/etc/skel/.bashrc
. Denken Sie daran, dass Sie erneut eine Verbindung herstellen müssen, damit die Änderungen wirksam werden, und stellen Sie sicher, dass Sie eine Sicherungskopie Ihrer eigenen .bashrc-Datei erstellen.tput smam
Antworten:
Stellen Sie sicher, dass alle nicht druckbaren Bytes in Ihrer PS1 enthalten sind
\[ \]
. Andernfalls zählt bash sie in der Länge der Eingabeaufforderung. Anhand der Länge der Eingabeaufforderung wird festgelegt, wann die Zeile umgebrochen werden soll.In diesem Beispiel zählt bash die Eingabeaufforderung als 19 Spalten breit, während die vom Terminal angezeigte Eingabeaufforderung nur 10 Spalten breit ist (
My prompt
in Cyan und>
in Standardfarbe geschrieben):Während hier nur die Eingabeaufforderung als 10 Spalten breit gezählt wird, werden die Bytes zwischen dem Sonderzeichen
\[
und dem\]
Escapezeichen ignoriert :Für eine gute Praxis verwenden Sie jedoch
tput
, um die Terminal-Escapes zu generieren, anstatt sie hart zu codieren:Siehe http://mywiki.wooledge.org/BashFAQ/053 , und auch http://wiki.bash-hackers.org/scripting/terminalcodes für mehr auf
tput
.quelle
PS1='...'
: Warum verhindern$cyan
und verhindern einfache Anführungszeichen nicht die$reset
Ersetzung?$cyan
und verhindern$reset
das Ersetzen, werden jedochPS1
jedes Mal ausgewertet, wenn die Eingabeaufforderung gedruckt wird. Sie können dies feststellen, indem Sie versuchenPS1='$var> '
,var
verschiedene Werte einzugeben und zu überprüfen, wie sich die Eingabeaufforderung ändert. Versuchen Sie dann festzustellenPS1="$var> "
, dass die Eingabeaufforderung statisch bleibt.$var
Wurde während der Zuweisung erweitert, wird nicht jedes MalPS1
ausgewertet.PS1=${PS1}"\e]2;$@\a"
. Ich habe es versuchtPS1=${PS1}"\[\e]2;\]$@\[\a\]"
Ich denke du hast deine
PS1
mit Farben konfiguriert , oder?Stellen Sie einfach sicher, dass Sie
\[
in IhremPS1
Zitat vor Ihrem Farbsatz habenZum Beispiel:
quelle
export PS1='^[[96m'$(hostname)'<^[[92m${PWD}^[[96m>^[[97m '
- ich benutze sie schon lange - KSH-kompatibel ...\[
am Anfang und\]
am Ende.\\[
war ein Tippfehler, der durch eine Bearbeitung verursacht wurde. Ich habe es behoben.Ich hatte ein ähnliches Problem und fand schließlich eine einfache Lösung.
Fügen Sie folgende Zeile in Ihre
.bashrc
Datei ein:Geben
source ~/.bashrc
Sie dann den gewünschten Effekt ein.quelle
source .bashrc
. Ihresetwinsize
Set für meine bash, so war es nicht SäULEN Updates verfügt , siehe unix.stackexchange.com/a/167911/8337export COLUMNS=250
gefolgtexport TERM=xterm
und es war glücklich.Ich hatte das gleiche Problem mit einer benutzerdefinierten farbigen Eingabeaufforderung, obwohl ich Farbcodes in
\[
und\]
Trennzeichen enthielt . Es stellt sich heraus, dass Bash Probleme mit der Farbwiedergabe innerhalb einer Funktion hat . Am Ende habe ich nur Variablen für meine Eingabeaufforderung verwendet, und obwohl mein .bashrc etwas weniger elegant ist, funktioniert jetzt alles gut.quelle
Es ist ganz einfach, vor dem Einstellen der PS1 die folgende Zeile einzufügen:
Zum Beispiel,
Dies betrifft jedoch auch andere Unix-Befehle wie ls und man.
quelle
Ich hatte dieses Problem, als ich in tmux verbunden war. Das Problem war, dass ich eine
ipython
Sitzung im Hintergrund hatte (ctrl + z
) und irgendwie Zeilenumbruch brach. Sobald ich es (fg
,ctrl+d+d
) beendet habe , hat mein Terminal ordnungsgemäß funktioniertSuchen Sie daher nach angehaltenen interaktiven Eingabeaufforderungen.
quelle
Also hatte ich nur das gleiche Problem mit einer leichten Wendung und ich dachte, ich würde auch meine Lösung teilen, nur um meine kleine Nuance hinzuzufügen: D
Meine anfängliche PS1 war
Das Problem , das ich hatte , war , dass ich versuche , meinen Terminal zu ändern Titel sowie die Eingabeaufforderung. Das habe ich durch Hinzufügen
\[\033]0;\]Title\a
zur PS1- Variablen gemacht.So, jetzt war meine PS1:
Das hat den Zeilenumbruch für mich durcheinander gebracht. Ich habe endlich herausgefunden, dass Bash
\a
am Ende nicht gerne zu haben scheint . Um dies zu umgehen, habe ich den Titel in eine Variable eingefügt, die ihn zu korrigieren schien.quelle
\[
und\]
hat nicht für mich gearbeitet. Ich vermute, dass es etwas anderes gab, als ich die Eingabeaufforderung (aus einem externen Programm) generiert habe, oder weil meine Eingabeaufforderung "dynamisch" war.Nachdem ich dies gelesen hatte, stellte ich fest, dass man die Farbcodes tatsächlich mit den
0x01
und0x02
Bytes umgehen kann.ZB verwende ich eine spezielle Version von Kreide und wickle die Farben folgendermaßen um:
quelle