Attiva / disattiva il formato della stringa del prompt del terminale gnome con il comando?


9

Il mio terminale ha un formato di prompt predefinito come questo:

username @ boxname / path / to / current / directory $

Il codice che lo produce è simile al seguente: (ha anche alcune definizioni di colore)

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

Se il percorso della directory corrente diventa troppo lungo, diventa spiacevole lavorare con il terminale perché si interrompono costantemente le linee. In questi casi preferirei un formato che produca una stringa più corta come questa:

nomeutente @ boxname current_dir_name $

Il codice che lo produce sarebbe simile a questo (di nuovo con il colore):

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

Qualcuno sa come potrei facilmente cambiare il formato della finestra del terminale corrente da uno stile all'altro semplicemente digitando ad esempio prompttoggle:?


6
Sei a conoscenza del parametro PROMPT_DIRTRIM di bash ?
Steeldriver,

@steeldriver non fino ad ora. Commutare tra PROMPT_DIRTRIM=0e PROMPT_DIRTRIM=1sembra più semplice che alternare tra valori diversi per PS1e il risultato è quasi lo stesso. Grazie per le informazioni!
Rotareti,

L'utilizzo di PROMPT_DIRTRIMuno potrebbe anche aggiungere argomenti al comando. Se non passi alcun argomento tra cui passare PROMPT_DIRTRIM=0e PROMPT_DIRTRIM=1e se passi un numero come argomento impostato PROMPT_DIRTRIMsu di esso. promptlensarebbe quindi un nome più appropriato per il comando.
Rotareti,

Risposte:


10

Memorizza le PS1variabili long e short con un nome diverso:

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\]'

Assicurati di impostarne PS1uno inizialmente:

PS1="$PS1long"

Quindi puoi creare un alias come questo per alternare tra i due valori di PS1:

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

L'aggiunta di tutte e quattro le righe al ~/.bashrcfile consentirà il comando disponibile nelle sessioni Bash, eccole di nuovo per una copia più semplice:

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

Puoi usare una piccola bashfunzione:

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 ;}

La funzione sopra corrisponde se la corrente $PS1contiene basename, se sì, allora viene impostato il PS1senza, basenamealtrimenti viene impostato quello con basename.

Inserisci la funzione nel tuo ~/.bashrcper renderla disponibile in tutte le sessioni interattive.

Esempio:

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

Oppure ... fare due molto funzioni piccole e aggiungere alla fine del~/.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') ; }

per un prompt abbreviato, digitare promptshort, per tornare al percorso completo, digitarepromptlong

\Wmostra solo la directory di lavoro corrente, quindi $(basename ${PWD})overkill imho

È possibile combinare in una funzione, ma "long" e "short" sono descrittivi ed entrambi hanno meno tasti di "toggle";)

Invece di aggiungere una riga per sovrascrivere PS1, preferisco modificare il codice che la imposta (ad esempio, rimuovere il commento force_color_prompt=yese modificare la riga dopo [ "$color_prompt" = yes ]; then)


3

Ecco una ~/.bashrcdefinizione di funzione che uso personalmente per reimpostare / alternare il mio prompt dal prompt regolare a just $. Adattalo come necessario per soddisfare le tue esigenze.

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

1

Questa è una risposta al tuo problema (lunghe directory interrompono la riga di comando) e non specificamente alla tua domanda (come cambiare al volo il prompt dei comandi.)

Ho risolto questo problema anni fa con questo prompt:

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

Cosa fa questo:

  1. emette il valore di uscita del comando precedente (questo è incredibilmente utile)
  2. visualizza l'utente e l'host correnti in un unico colore
  3. stampa la directory di lavoro in un altro colore (regola i colori secondo i tuoi gusti)
  4. genera il dollaro e lo spazio su una nuova riga , terminando le sequenze di colori prima dell'interruzione di riga

Questo ti dà tutto lo spazio di cui hai bisogno per il tuo comando, non lo sposta correttamente quando ti trovi in ​​una struttura di directory profonda, non altera la riga di battitura con i codici colore (evitando strani bug che accadono a volte), mentre ti dà ancora il colore suggerimento su dove termina l'output di un comando e inizia quello successivo:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.