it-swarm-eu.dev

Mostra solo il nome della directory corrente (non il percorso completo) sul Prompt di bash

Il modo in cui il mio prompt di bash è attualmente configurato, mostra l'intero percorso della directory corrente. Questo è fastidioso quando sono nel profondo di un albero di directory, poiché il Prompt diventa così lungo che ogni comando si inserisce 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\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

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

Cambia \w (in minuscolo) in \W (maiuscolo):

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected]\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:

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

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

[email protected]:bin$

La variabile Prompt_COMMAND, se impostata, è un comando che viene eseguito prima di visualizzare il prompt specificato in PS1. Nel tuo caso, Prompt_COMMAND esegue un'istruzione echo con alcune sequenze di escape ANSI che manipolano la barra del titolo di un Xterm .

Se sospetti che il tuo Prompt_COMMAND stia sovrascrivendo il tuo PS1 Prompt, puoi unset it e testare le cose:

$ unset Prompt_COMMAND

Infine, assicurati di modificare la definizione PS1 effettivamente utilizzata. Le posizioni comuni sono /etc/bash.bashrc, /etc/profile, ~/.bashrc, ~/.bash_profile, ~/.profile. I file di sistema sono generalmente (ma non sempre) eseguiti prima dei file dell'utente.

89
quack quixote

Il semplice comando di sostituzione di bash è

${VAR/pattern_to_find/pattern_to_replace}

Per mostrare l'ultima directory puoi semplicemente fare ${PWD/*\//}, cioè trovare qualsiasi cosa prima e includere l'ultimo '/' e sostituirlo con niente.

Sulla mia macchina Ubuntu uso:

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

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

Crea un'altra variabile stringa Prompt; PS5 ed esporta la seguente stringa nel tuo file .profile/.bash_profile:

\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, quando hai bisogno di usare la PS stenografia, esegui semplicemente: eval $PS5


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

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

source di nuovo, e ora puoi semplicemente digitare PS5 per passare.

4
U-ways

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 PS1 Prompt è 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 il ramo git attuale, lo tengo nei miei dotfile, è:

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

Mostra solo il nome della directory corrente (non il percorso completo) sul 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 vecchie versioni che non supportavano determinati costrutti e non volevo eseguire il fork di un altro processo (ad esempio sed, awk, ecc.) 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

Notare la mancanza di una barra principale nell'ultima riga che è come mi piace. Inoltre, puoi sputare le ultime 3 directory cambiando l'argomento in DIR_LAST.

Inoltre, ho provato a fare questo con un'espressione regolare e BASH_REMATCH ma bash v3 non sembrava gradire i paren e non riuscivo a capire come evitarli correttamente. Sospiro.

1
Gray
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\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[01;31m\]$(parse_git_branch)\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\[email protected]\h:\w$(parse_git_branch)\$ '
fi
unset color_Prompt force_color_Prompt
0
Ali Alp

Ecco un fantastico piccolo strumento che fornisce un'interfaccia drag/drop per creare il tuo prompt di bash, che puoi quindi copiare nel tuo .bashrc. Utilizzare l'elemento "Directory (basename)" per mostrare solo il nome della cartella corrente, piuttosto che l'intero percorso.

0
HoboFlo

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
Dani Mach