Basierend auf den Informationen, die ich hier fand, konnte ich eine einfachere Lösung zum Rechtsausrichten finden, während Inhalte mit variabler Länge auf der rechten oder linken Seite angezeigt werden, einschließlich der Unterstützung von Farbe. Hier hinzugefügt für Ihre Bequemlichkeit ...
Hinweis zu Farben: Die Verwendung der \033
Flucht zugunsten von Alternativen ohne \[\]
Gruppierungen erweist sich als am besten geeignet und wird daher empfohlen.
Der Trick besteht darin, zuerst die rechte Seite zu schreiben, dann mit dem Wagenrücklauf ( \r
) zum Zeilenanfang zurückzukehren und den Inhalt der linken Seite wie folgt zu überschreiben:
prompt() { PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left') } PROMPT_COMMAND=prompt
Ich verwende tput cols
unter Mac OS X, um die Breite des Terminals / der Konsole abzurufen, terminfo
da mein $COLUMNS
var nicht eingetragen ist. env
Sie können stattdessen den ersetzbaren *
Wert " " ersetzen %*s
, indem $
Sie stattdessen " " oder einen anderen Wert angeben.
Das nächste Beispiel $RANDOM
zum Generieren von Inhalten unterschiedlicher Länge enthält Farben und zeigt, wie Sie Funktionen extrahieren können, um die Implementierung in wiederverwendbare Funktionen umzuwandeln.
function prompt_right() { echo -e "\033[0;36m$(echo $)\033[0m" } function prompt_left() { echo -e "\033[0;35m$\033[0m" } function prompt() { compensate=11 PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+$))" "$(prompt_right)" "$(prompt_left)") } PROMPT_COMMAND=prompt
Da printf
angenommen wird, dass die Länge der Zeichenfolge die Anzahl der Zeichen ist, die zum Kompensieren der zum Rendern der Farben erforderlichen Anzahl von Zeichen erforderlich sind, werden Sie feststellen, dass das Ende des Bildschirms aufgrund der nicht gedruckten ANSI-Zeichen ohne Kompensation immer knapp ist. Die für die Farbe erforderlichen Zeichen bleiben konstant, und Sie werden feststellen, dass printf auch die Längenänderung berücksichtigt, wie sie $RANDOM
beispielsweise von ' zurückgegeben wird ', wodurch unsere richtige Ausrichtung erhalten bleibt.
Dies ist nicht der Fall mit speziellen Bash - Prompt - Escape - Sequenzen (dh. \u
, \w
, \h
, \t
), Obwohl, da diese nur eine Länge von 2 aufzeichnen, weil bash sie nur übersetzen, wenn die Eingabeaufforderung angezeigt wird, nachdem printf die Zeichenfolge verdient gemacht hat. Dies wirkt sich nicht auf die linke Seite aus, am besten jedoch, um sie rechts zu vermeiden.
Ohne Folgen, wenn der erzeugte Inhalt jedoch konstant bleibt. Wie bei der \t
Zeitoption, die immer 24 Mal die gleiche Anzahl von Zeichen (8) wiedergibt. Wir müssen nur die erforderliche Kompensation berücksichtigen, um den Unterschied zwischen zwei gezählten Zeichen auszugleichen, was in diesen Fällen beim Drucken zu 8 Zeichen führt.
Denken Sie daran, dass Sie möglicherweise \\\
einige Escape-Sequenzen, die ansonsten eine Bedeutung für Strings haben, möglicherweise dreifach umgehen müssen. Wie im folgenden Beispiel hat das aktuelle Arbeitsverzeichnis-Escape \w
keine Bedeutung. Andernfalls funktioniert es wie erwartet, aber die Zeit \t
( dh ein Tabulatorzeichen) funktioniert nicht wie erwartet, ohne dass zuvor ein dreifaches Escape- Verfahren durchgeführt wurde .
function prompt_right() { echo -e "\033[0;36m\\\t\033[0m" } function prompt_left() { echo -e "\033[0;35m\w\033[0m" } function prompt() { compensate=5 PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+$))" "$(prompt_right)" "$(prompt_left)") } PROMPT_COMMAND=prompt
nJoy!