Mostra solo il nome della directory corrente (non il percorso completo) al prompt di bash


71

Il modo in cui il mio prompt di bash è attualmente configurato, mostra l'intero percorso della directory corrente. Questo è fastidioso quando mi trovo nel profondo di un albero di directory, poiché il prompt diventa così lungo che ogni comando si sposta nella riga successiva. Come faccio a mostrare solo l'ultima parte del percorso?

Questo è quello che ho nel mio .bashrc:

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

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
    ;;
*)
    ;;
esac

Risposte:


98

Cambia da \w(minuscolo) a \W(maiuscolo):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '
                                                                                       ^^
           this one waaaaaay over here ------------------------------------------------+    

Dai un'occhiata al Bash Prompt HOWTO per molti dettagli divertenti. esempio:

user@host:/usr/local/bin$ echo $PS1
${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ 

user@host:/usr/local/bin$ export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\W\[\033[00m\]\$ '

user@host:bin$

La PROMPT_COMMANDvariabile, se impostata, è un comando che viene eseguito prima di visualizzare il prompt specificato in PS1. Nel tuo caso, PROMPT_COMMANDesegue echoun'istruzione con determinate sequenze di escape ANSI che manipolano la barra del titolo di un Xterm .

Se sospetti che il tuo messaggio PROMPT_COMMANDvenga ignorato PS1, puoi unsetfarlo e testare le cose:

$ unset PROMPT_COMMAND

Infine, assicurati di modificare la PS1definizione che viene effettivamente utilizzata. Luoghi comuni sono /etc/bash.bashrc, /etc/profile, ~/.bashrc, ~/.bash_profile, ~/.profile. I file di sistema vengono generalmente (ma non sempre) eseguiti prima dei file dell'utente.


Hm ... temo che sia già \ w, ma sembra che casequell'affermazione lo prevalga quando sono su un xterm, e il problema sembra essere con PWDin the PROMPT_COMMANDline. Sai cosa dovrei mettere lì?
hsribei,

4
\w(minuscolo) lo imposta sul percorso completo, \W(maiuscolo) taglia il bit finale. PROMPT_COMMAND sta impostando il titolo della finestra in un xterm. controlla la tua variabile TERM; se non inizia con "xterm" o "rxvt", PROMPT_COMMAND non si avvia nemmeno.
Quack Quixote,

Oh, si, duh. Mi dispiace, ho mescolato lettere maiuscole e minuscole. Ha funzionato Grazie! :)
hsribei,

Bella risposta. Assicurati di riavviare affinché questo abbia effetto. Grazie!
Combina

14

Il semplice comando bash replace è

${VAR/pattern_to_find/pattern_to_replace}

Per mostrare l'ultima directory che puoi semplicemente fare ${PWD/*\//}, cioè trovare qualsiasi cosa prima e includendo l'ultima ' /' e sostituirla con nulla.

Sulla mia macchina Ubuntu utilizzo:

export PS1='$(whoami):${PWD/*\//}#'. 

1
Mi piace questa risposta meglio di quella accettata perché è generica per qualsiasi situazione anziché solo la speciale logica di analisi di $ PS1. Meno strumenti più potenti sono più facili da ricordare e comporre. :)
David Ellis,

4

La mia soluzione è mostrare le prime tre e le ultime 2 directory quando ce ne sono più di 5

Quindi il mio prompt (che ha anche altre informazioni) assomiglia a:

08:38:42 durrantm U2017 /home/durrantm/Dropbox/_/rails/everquote

quando il mio pwd è in realtà

/home/durrantm/Dropbox/93_2016/work/code/ruby__rails/rails/everquote

Il mio prompt per PS1 è configurato come segue:

HOST='\[\033[02;36m\]\h'; HOST=' '$HOST
TIME='\[\033[01;31m\]\t \[\033[01;32m\]'
LOCATION=' \[\033[01;34m\]`pwd | sed "s#\(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/\).*\(/[^/]\{1,\}/[^/]\{1,\}\)/\{0,1\}#\1_\2#g"`'
BRANCH=' \[\033[00;33m\]$(git_branch)\[\033[00m\]\n\$ '
PS1=$TIME$USER$HOST$LOCATION$BRANCH

git_branch è una funzione che mostra l'attuale ramo git, lo tengo nei miei dotfile, è:

git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
  }

Questo e spettacolare! Grazie mille per questa risposta
Carlos F,

4

La mia soluzione per questo è leggermente diversa rispetto a come esportarla, quindi ho pensato di condividerla qui:

Creare un'altra variabile stringa prompt; PS5 ed esporta la seguente stringa nel tuo .profile/ .bash_profilefile:

\ u : visualizza il nome utente corrente.

\ W : stampa la base della directory di lavoro corrente.

# Display username and current directory only.
export PS5='export PS1="\u:\W$";';

Ora, ogni volta che è necessario utilizzare la PS abbreviata, basta eseguire: eval $PS5


O ancora meglio, crea un alias nel tuo .bash_aliasesfile: (grazie a @muru )

alias PS5='export PS1="\u:\W$";';

sourcedi nuovo, e ora puoi semplicemente digitare PS5per cambiare.


1
Sembra una francenalia. Perché non usare solo un alias o una funzione?
Muru,

1

Mostra solo il nome della directory corrente (non il percorso completo) al prompt di bash

La maggior parte delle altre soluzioni non ha funzionato per me su tutti i miei sistemi operativi che condividono i miei file dot: AIX, Windoze e Linux. Le porte bash erano versioni vecchie che non supportano certi costrutti e non mi volevano fork altro processo (cioè sed, awkecc) che è notevolmente costoso sotto Cygwin.

Quanto segue è lungo ma performante:

# takes a number argument of the number of last dirs to show
function DIR_LAST {
    # read -a didn't seem to work under bash 3
    IFS='/' array=($PWD)
    len=${#array[@]}
    start=$((len - $1))
    # leading / if fewer dir args: /usr/flastname not usr/flastname
    if (( $start <= 1 )); then
        start=1
        echo -n /
    fi
    for (( i = $start; $i < $len; i++ )); do
        if (( $i > $start )); then
            echo -n /
        fi
        echo -n ${array[$i]}
    done
}
export PS1="\$(DIR_LAST 2) {$(hostname)} "

Voglio che sputi:

/
/usr
/usr/foo
foo/bin

Si noti la mancanza di una barra iniziale nell'ultima riga, ed è così che mi piace. Inoltre, puoi sputare le ultime 3 directory cambiando arg in DIR_LAST.

Inoltre, ho provato a farlo con un regex, BASH_REMATCHma a bash v3 non sembravano piacere i genitori e non riuscivo a capire come sfuggirli correttamente. Sospiro.


0

Credo che questa opzione sia molto più semplice, semplicemente facendo:

echo $PWD | rev | cut -d '/' -f 1 | rev

Quindi assegna questo alla variabile PS1 nel tuo file .bashrc:

PS1='$(PWD | rev | cut -d '/' -f 1 | rev)'

0
root:~/project#  -> root:~/project(dev)# 

aggiungi il seguente codice alla fine del tuo ~ / .bashrc

force_color_prompt=yes
color_prompt=yes
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt
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.