Ich habe vor kurzem meine PS1 ein wenig optimiert. Der Code lautet wie folgt:
PS1='$(if [[ $? != 0 ]]; then echo " \e[91m\e[0m"; fi) \u $(assemble_prompt)$ '
Das fehlende Zeichen stammt vonNerd-Schriftartenund spielt in meiner Frage (ebenso wie in assemble_prompt
der Funktion) keine Rolle.
Das Problem, auf das ich gestoßen bin, ist ein defektes PS1, wenn ich die Größe des Terminalfensters auf die Größe einer Eingabeaufforderung (ungefähr) verkleinere. Dann scheint es die PS1-Einstellung zu ignorieren und PS1 $
nur auf Zeichen einzustellen (siehe Screenshot). Beachten Sie, dass es in diesem Fall einfach meine benutzerdefinierte Eingabeaufforderung überschreibt, wenn ich mit dem Tippen beginne.
Ich habe das Problem auf eine if-Klausel eingegrenzt, die das Zeichen „fail“ hinzufügt, wenn der vorherige Befehl nicht erfolgreich war. Wenn ich diesen Teil entferne, funktioniert alles wie erwartet.
Gibt es eine Möglichkeit, den Klauselteil beizubehalten if
, aber das Problem mit dem PS1-Reset zu beheben, wenn die Fenstergröße zu klein ist?
PS: Ich verwende rxvt-unicode
als mein Terminal, aber das Problem besteht auch bei allen anderen Terminals (getestet xterm
, st
).
Antwort1
Sie möchten die Terminal-Steuercodes wahrscheinlich einschließen, um \[...\]
Bash mitzuteilen, dass sie eigentlich keine Zeichen drucken. Andernfalls verwirren sie die Shell, wenn sie versucht, die Breite der Eingabeaufforderung zu zählen.
Verwenden Sie also "\[\e[91m\]xxx\[\e[0m\]"
.
Von demHandbuch:
\[ Begin a sequence of non-printing characters.
This could be used to embed a terminal control sequence into the prompt.
\] End a sequence of non-printing characters.