Bash PS1 Setup

9

Ich versuche, PS1 wie folgt zu konfigurieren.

Grün = "\ [\ e [32; 1m \]"
Rot = "\ e [0; 31m"
Lila = "\ e [0; 35m"
STARTCOLOR = "\ [\ e [40m \]"
ENDCOLOR = "\ [\ e [0m \]"
export PS1 = "$ STARTCOLOR $ Green \ u @ $ Purple \ h $ Red \ w $ Green> $ ENDCOLOR"

Und ich habe einige Fragen.

  • Was ist der Unterschied zwischen "[\ e [32; 1m]" und \ e [32; 1m "? Sind sie gleich?
  • Nach dem Ausführen des Befehls 'PS1 exportieren' funktioniert es gut, aber wenn ich die Eingabe auf etwa 20 Zeichen gebe, werden die Zeichen beim Anhängen überschrieben. Was ist daran falsch?
  • Was bedeutet STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

http://a.imageshack.us/img8/606/resultqm.jpg

HINZUGEFÜGT

Nach einigen Tests bekam ich die folgende Änderung, um das Problem zu lösen. Das heißt, das Format "\ e" sollte durch das Format "\ [\ e" ersetzt werden.

Rot = "\\ e [1; 31m" - funktioniert nicht
Rot = "\ [\ e [1; 31m \]" - funktioniert
prosseek
quelle

Antworten:

12

Ich habe eine Hilfsfunktion zum Festlegen der Eingabeaufforderung. Da ich nicht mehr Zeit für die Suche nach Escape-Code-Referenzen aufwenden möchte, habe ich alle Textfarbwerte darin codiert.

function set_prompt ( )
{
    # Prompt setup
    # ##################

    # Black            \e[0;30m
    # Blue             \e[0;34m
    # Green            \e[0;32m
    # Cyan             \e[0;36m
    # Red              \e[0;31m
    # Purple           \e[0;35m
    # Brown            \e[0;33m
    # Gray             \e[0;37m
    # Dark Gray        \e[1;30m
    # Light Blue       \e[1;34m
    # Light Green      \e[1;32m
    # Light Cyan       \e[1;36m
    # Light Red        \e[1;31m
    # Light Purple     \e[1;35m
    # Yellow           \e[1;33m
    # White            \e[1;37m

    local COLOR_DEFAULT='\[\e[0m\]'
    local COLOR_BLACK='\[\e[0;30m\]'
    local COLOR_BLUE='\[\e[0;34m\]'
    local COLOR_GREEN='\[\e[0;32m\]'
    local COLOR_CYAN='\[\e[0;36m\]'
    local COLOR_RED='\[\e[0;31m\]'
    local COLOR_PURPLE='\[\e[0;35m\]'
    local COLOR_BROWN='\[\e[0;33m\]'
    local COLOR_GRAY='\[\e[0;37m\]'
    local COLOR_DARK_GRAY='\[\e[1;30m\]'
    local COLOR_L_BLUE='\[\e[1;34m\]'
    local COLOR_L_GREEN='\[\e[1;32m\]'
    local COLOR_L_CYAN='\[\e[1;36m\]'
    local COLOR_L_RED='\[\e[1;31m\]'
    local COLOR_L_PURPLE='\[\e[1;35m\]'
    local COLOR_YELLOW='\[\e[1;33m\]'
    local COLOR_WHITE='\[\e[1;37m\]'

    local PS1_SET_TITLE='\[\e]0;\w\a\]'

    local PS1_SET_TIME="${COLOR_DEFAULT}\t"
    local PS1_SET_RET_CODE="${COLOR_L_RED}(\$?)"
    local PS1_SET_USER="${COLOR_L_GREEN}\u@\h"
    local PS1_SET_PWD="${COLOR_YELLOW}\w"

    local PS1_LN_1="${PS1_SET_TITLE}\n"
    local PS1_LN_2="${PS1_SET_TIME} ${PS1_SET_RET_CODE} "
    local PS1_LN_2="${PS1_LN_2}${PS1_SET_USER} ${PS1_SET_PWD} ${COLOR_DEFAULT}\n"

    echo "${PS1_LN_1}${PS1_LN_2}"
}

Sie können dann tun:

PS1=$( set_prompt )

# Use '#' for root shell
export PS1=${PS1}'$ '

unset -f set_prompt

Hier ist der Link, der die VT100-Terminalcodes erklärt: http://www.termsys.demon.co.uk/vtansi.htm

\[- Beginn der Sequenz nicht druckbarer Zeichen
\]- Ende der Sequenz nicht druckbarer Zeichen

  • Was ist der Unterschied zwischen "[\ e [32; 1m]" und \ e [32; 1m "? Sind sie gleich?

Nicht dasselbe, und es sollte \[\e[32;1m\]'. Without[] `sein, es würde versuchen, die Sequenz in der Konsole zu drucken.

  • Was bedeutet STARTCOLOR (\ e [40m) / ENDCOLOR (\ e [0m)?

STARTCOLOR bedeutet, den Hintergrund auf Schwarz zu setzen, ENDCOLOR bedeutet, alle Textattribute zurückzusetzen, was bedeutet, dass ich die Standardfarbe der Konsole habe.

Alexander Pogrebnyak
quelle
+1 Sehr schön !!! Es macht mir nichts aus, ich kopiere dies auf meine Basis :)
Eldelshell
@Ubersoldat. Ganz und gar nicht.
Alexander Pogrebnyak
1
Verwenden Sie \$diese Option, um automatisch zwischen Root- und Nicht-Root-Anzeige zu wechseln.
Bis auf weiteres angehalten.
9

Aus dem Bash-Handbuch:

\[    Beginnen Sie eine Folge von nicht druckbaren Zeichen, mit der eine Terminalsteuerungssequenz in die Eingabeaufforderung eingebettet werden kann. Beenden Sie
\]    eine Folge von nicht druckbaren Zeichen

\[und \]werden nicht an das Terminal übergeben. Sie sagen Bash, dass die Zeichen zwischen ihnen nicht gedruckt werden. Ohne sie könnte bash nicht wissen, dass die Sequenz nach dem Escape-Zeichen (z. B. [32;1m) keinen Platz auf dem Bildschirm einnimmt, was erklärt, warum die Länge der Eingabeaufforderung nicht korrekt berechnet wurde, als Sie sie weggelassen haben.

Beachten Sie, dass Sie in Ihrer Frage nicht sehr konsequent waren (oder dass es nur ein Fehler mit Markdown ist). Sie müssen eine wörtliche Backslash-Bracket-Sequenz haben $PS1, nicht nur eine Bracket (die buchstäblich angezeigt wird).

Die mit beginnenden Escape-Sequenzen \ewerden vom Terminal-Emulator interpretiert. Sie sind im Dokument Xterm Control Sequences (ctlseqs) dokumentiert (andere Terminalemulatoren sind in der Regel größtenteils kompatibel). Wechselt beispielsweise \e[32;1mzu fettem und grünem Vordergrund. \e[40mschaltet die Hintergrundfarbe auf Schwarz um; \e[0mstellt die Standardattribute wieder her.

Gilles 'SO - hör auf böse zu sein'
quelle
3

Die meisten modernen Terminalemulatoren können ANSI-Escape-Codes verwenden, um verschiedene Aspekte der Anzeige zu steuern.

Die meisten ANSI-Codes beginnen mit dem 2-stelligen Code ESC- [Dies ist das Escape-Zeichen (ASCII-Dezimalzahl 27), gefolgt vom offenen Zeichen in eckiger Klammer. Diese Sequenz wird auch als CSI oder Control Sequence Initiator bezeichnet.

Da es sich bei dem Escape-Zeichen nicht um ein Zeichen handelt, das Sie direkt eingeben können (die Esc-Taste hat andere, häufig anwendungsspezifische Verwendungszwecke), verwendet bash '\ e', um darauf zu verweisen.

Zum Ändern der Textfarbe wird der Befehl ANSI Set Graphics Mode verwendet:

\e[<value>m

Dabei <value>kann eine Liste von Werten durch Semikolons ( ;) getrennt sein. Normalerweise wird nur ein Wert verwendet, obwohl das Fettattribut in Verbindung mit den Farbattributen nützlich ist.

Wenn Sie sich die in der Antwort von Alexander Pogrebnyak aufgeführten Werte ansehen, wählt die 0 oder 1 vor dem Semikolon fett oder nicht:

\e[1m  # bold
\e[5m  # blink
\e[0m  # all attributes off

Eine nützliche Liste der Codes finden Sie hier http://ascii-table.com/ansi-escape-sequences.php

dr-jan
quelle