Format der Gnome-Terminal-Eingabeaufforderungszeichenfolge per Befehl umschalten?


9

Mein Terminal hat ein Standard-Eingabeaufforderungsformat wie dieses:

Benutzername @ Boxname / Pfad / zu / aktuelles / Verzeichnis $

Der Code, der es erzeugt, sieht folgendermaßen aus: (es hat auch einige Farbdefinitionen)

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'

Wenn der Pfad zum aktuellen Verzeichnis zu lang wird, wird es unangenehm, mit dem Terminal zu arbeiten, da Sie ständig Zeilenumbrüche vornehmen. In solchen Fällen würde ich ein Format bevorzugen, das eine kürzere Zeichenfolge wie diese erzeugt:

Benutzername @ Boxname aktueller_Verzeichnisname $

Der Code, der es erzeugt, würde so aussehen (wieder mit Farbe):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

Weiß jemand, wie ich das Format des aktuellen Terminalfensters einfach von einem Stil zum anderen umschalten kann, indem ich einfach Folgendes eingebe : prompttoggle?


6
Kennen Sie den PROMPT_DIRTRIM- Parameter von bash ?
Steeldriver

@steeldriver bis jetzt nicht. Das Umschalten zwischen PROMPT_DIRTRIM=0und PROMPT_DIRTRIM=1scheint einfacher zu sein als das Umschalten zwischen verschiedenen Werten für PS1und das Ergebnis ist fast das gleiche. Danke für die Information!
Rotareti

Die Verwendung von PROMPT_DIRTRIMone kann dem Befehl auch Argumente hinzufügen. Wenn Sie kein Argument übergeben, wechseln Sie zwischen PROMPT_DIRTRIM=0und, PROMPT_DIRTRIM=1und wenn Sie eine Zahl als Argument übergeben, setzen Sie PROMPT_DIRTRIMsie. promptlenwäre dann ein passenderer Name für den Befehl.
Rotareti

Antworten:


10

Speichern Sie sowohl Ihre langen als auch Ihre kurzen PS1Variablen unter einem anderen Namen:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'

Stellen Sie zunächst sicher, dass PS1einer von ihnen eingestellt ist:

PS1="$PS1long"

Dann können Sie einen Alias ​​wie diesen erstellen, um zwischen den beiden PS1-Werten umzuschalten:

alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

Durch Hinzufügen aller vier Zeilen zu Ihrer ~/.bashrcDatei wird der in Ihren Bash-Sitzungen verfügbare Befehl ausgeführt. Hier sind sie erneut, um das Kopieren zu vereinfachen:

PS1short='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
PS1long='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
PS1="$PS1long"
alias prompttoggle='if test "$PS1" = "$PS1long" ; then PS1="$PS1short" ; else PS1="$PS1long" ; fi'

7

Sie können eine winzige bashFunktion verwenden:

prompttoggle () { 
    if [[ $PS1 = *basename* ]]; then 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
    else 
        export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
    fi ;}

Die obige Funktion stimmt überein, wenn der Strom $PS1enthält basename, wenn ja, dann ist das PS1ohne basenamegesetzt, andernfalls ist das mit basenamegesetzt.

Fügen Sie die Funktion in Ihre ein ~/.bashrc, um sie in allen interaktiven Sitzungen verfügbar zu machen.

Beispiel:

foo@bar:~/spam/egg$ prompttoggle () { 
>     if [[ $PS1 = *basename* ]]; then 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\]'
>     else 
>         export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[01;34m\] $(basename ${PWD}) \$ \[\033[00m\]'
>     fi ;}

foo@bar:~/spam/egg$ prompttoggle 

foo@bar egg $ prompttoggle

foo@bar ~/spam/egg $

5

Oder ... machen Sie zwei sehr kleine Funktionen und fügen Sie am Ende Ihrer hinzu~/.bashrc

# short prompt
promptshort() { export PS1=$(echo "$PS1" | sed 's/\\w/\\W/g') ; }

# full length prompt
promptlong() { export PS1=$(echo "$PS1" | sed 's/\\W/\\w/g') ; }

Geben Sie für eine verkürzte Eingabeaufforderung Folgendes ein, promptshortum zum vollständigen Pfad zurückzukehrenpromptlong

\Wzeigt nur das aktuelle Arbeitsverzeichnis an, also $(basename ${PWD})ist Overkill imho

Sie könnten zu einer Funktion kombinieren, aber "lang" und "kurz" sind beschreibend und beide haben weniger Tastenanschläge als "umschalten";)

Anstatt eine Zeile hinzuzufügen, um PS1 zu überschreiben, bevorzuge ich es, den Code zu optimieren, der sie festlegt (z. B. force_color_prompt=yesdie Zeile danach auskommentieren und bearbeiten [ "$color_prompt" = yes ]; then).


3

Hier ist eine ~/.bashrcFunktionsdefinition, die ich persönlich verwende, um meine Eingabeaufforderung von der regulären Eingabeaufforderung auf einfach zurückzusetzen / umzuschalten $. Passen Sie es nach Bedarf an Ihre Bedürfnisse an.

resetps() {
    if [ "$PS1" = "$ " ] 
    then
        PS1=$OLDPS1 
    else
        OLDPS1=$PS1 
        export OLDPS1 
        PS1="$ " 
    fi 
} 

1

Dies ist eine Antwort auf Ihr Problem (lange Verzeichnisse unterbrechen die Befehlszeile) und nicht speziell auf Ihre Frage (wie Sie die Eingabeaufforderung im laufenden Betrieb ändern können).

Ich habe dieses Problem vor Jahren mit dieser Eingabeaufforderung gelöst:

PS1='\[\e[32;1m\]$? \u@\h \[\e[35;1m\]\w\[\e[m\]\n\$ '
#    └──green───┘         └──purple──┘  └─norm─┘

Was dies tut:

  1. Geben Sie den Exit-Wert des vorherigen Befehls aus (dies ist unglaublich nützlich).
  2. Geben Sie den aktuellen Benutzer und Host in einer Farbe aus
  3. Geben Sie das Arbeitsverzeichnis in einer anderen Farbe aus (passen Sie die Farben nach Ihrem Geschmack an).
  4. Geben Sie den Dollar und das Leerzeichen in einer neuen Zeile aus und beenden Sie die Farbsequenzen vor dem Zeilenumbruch

Dies gibt Ihnen den gesamten Platz, den Sie für Ihren Befehl benötigen, verschiebt ihn nicht nach rechts, wenn Sie sich in einer tiefen Verzeichnisstruktur befinden, verstümmelt die Eingabezeile nicht mit Farbcodes (vermeidet seltsame Fehler, die manchmal auftreten) und gibt Ihnen dennoch die Farbe Hinweis, wo die Ausgabe eines Befehls endete und der nächste begann:

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.