Die farbige Bash-Eingabeaufforderung überschreibt die Ausgabe des vorherigen Befehls, wenn die Ausgabe nicht mit einem Zeilenumbruch endet

4

Bei Verwendung einer farbigen Eingabeaufforderung wird auf meinem System die letzte Zeile der Ausgabe des vorherigen Befehls überschrieben, wenn das letzte Zeichen der Ausgabe keine neue Zeile ist.

Beispiel: Unter Verwendung der nicht farbigen Standard-Bash-Eingabeaufforderung haben wir:

[meinbenutzername @ meinhostname dirname] $ echo -n foo-bar
foo-bar [meinbenutzername @ meinhostname dirname] $

Dies wird erwartet.

Verwenden Sie jedoch die folgende kolorierte Eingabeaufforderung:

PS1='\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]\$ '

Wir haben (hier ohne die Farbe gezeigt):

meinbenutzername @ meinhostname: ~ / pfad / zu / dirname $ echo -n foo-bar
meinbenutzername @ meinhostname: ~ / pfad / zu / dirname $ rname $ 

Der Cursor befindet sich jetzt auf dem letzten "r" in der Zeile. Wenn Sie an der Eingabeaufforderung einige Zeichen eingeben, wird der letzte "rname $" überschrieben. Das Endergebnis ist, dass, wenn die Ausgabe des vorherigen Befehls nicht in einer neuen Zeile endet, ich nicht sehen kann, was es ist. Dies ist das Wichtigste, was zu beheben ist. Die Art und Weise, wie die zusätzlichen Zeichen angezeigt werden, aber überschreibbar sind, stört mich nicht sonderlich, wäre aber auch nett zu beheben.

Ich habe dies mit anderen kolorierten Eingabeaufforderungen aus der Bash-Dokumentation und einigen kolorierten Eingabeaufforderungen aus anderen Superuser-Antworten zu kolorierten Eingabeaufforderungen versucht, und alle verhalten sich genau gleich.

$ bash --version
GNU Bash, Version 3.1.17 (1) -Release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

Ich bin mir nicht sicher, aber ich denke, es ist CentOS. Ich weiß nicht, welche Version. Geben Sie mir den Befehl, das Betriebssystem zu überprüfen, und ich werde es ausführen.

Bearbeitet
quelle
1
Ungerade. Welches Betriebssystem und welche Version von Bash? Ich sehe das beschriebene Verhalten bei der angegebenen Eingabeaufforderung unter Mac OS X 10.7.4 mit bash 3.2 und bash 4.2 nicht. Ist PROMPT_COMMAND auch auf irgendetwas gesetzt? Ich habe leider keine Vorschläge, aber vielleicht kann jemand anderes diese Informationen verwenden, um eine Lösung vorzuschlagen.
Chepner
Kann es auch nicht reproduzieren - meine Bash [3.2.48 (1) -Release (x86_64-apple-darwin11)] unter OS X 10.7.4 zeigt dieses Verhalten in Terminal.app nicht an. Berücksichtigen Sie, dass Ihre Farb-Escape-Codes korrekt in eckige Klammern gesetzt sind. Versuchen Sie zu deaktivieren PROMPT_COMMAND, um festzustellen , ob das Verhalten weiterhin besteht. Es wäre auch hilfreich, wenn Sie Ihre Bash-Version (run bash -- version) und Ihr Betriebssystem angeben würden .
kopischke
Nicht vertraut mit PROMPT_COMMAND. Ich habe gerade PS1 eingestellt. unset PROMPT_COMMANDhilft nicht $ echo $PROMPT_COMMANDgibt echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}"; echo -ne "\033\\"
Eddified
Hinweis: Ich habe die ursprüngliche Frage bearbeitet und Bash-Versionsinformationen hinzugefügt.
Geändert am

Antworten:

4

Meine bevorzugte Lösung besteht einfach darin, die Eingabeaufforderung immer mit einem Zeilenumbruch zu beginnen. Auf diese Weise habe ich zwischen der letzten Befehlsausgabe immer eine Leerzeile (außer natürlich in diesem Fall), was sich für mich natürlicher anfühlt. Und der schlimmste Fall ist, dass ich keine Leerzeile dazwischen bekomme, anstatt Text zu überschreiben, wie Sie es sehen. Ich kann es nur wärmstens empfehlen, wenn Sie es eine Weile ausprobieren und es einfach nicht aushalten können.

PS1='\n\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]\$ '

Ein zusätzlicher Vorschlag, wenn Sie dazu bereit sind: Ich verwende auch eine mehrzeilige Eingabeaufforderung, um die Befehlszeile vor dem Zeilenumbruch so lang wie möglich zu gestalten (oder einen Bildlauf durchzuführen, wenn Ihr Terminal oder Ihre Shell dafür konfiguriert ist). Ich möchte auch die Versionsnummer kennen. Diese beiden zusammen:

PS1='\n\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m \!\]\n\$ '

Schließlich möchte ich auch Zeitstempel vor und nach dem Ausführen von Befehlen drucken lassen. Eine vereinfachte Version von dem, was ich dafür benutze, ist:

export PROMPT_COMMAND="date +\"%Y-%m-%d %H:%M:%S (%s)\"; trap 'date +\"%Y-%m-%d %H:%M:%S (%s)\"; trap DEBUG' DEBUG"

Kopf drehen noch? :)

wajiii
quelle
3
Diese ausweicht ordentlich OPs Problem, aber es funktioniert nicht ansprechen OP das Problem - die Untersuchung wert wäre , ist die Frage unter Berücksichtigung nicht reproduzierbar auf OS X - Systemen ( 1 , 2 ) zum Beispiel (es ist auf Ihnen?).
kopischke