Mostra apenas o nome do diretório atual (não o caminho completo) no prompt do bash

67

A forma como meu prompt do bash está configurado atualmente, mostra o caminho completo para o diretório atual. Isso é irritante quando estou dentro de uma árvore de diretórios, já que o prompt se torna tão longo que todos os comandos entram na próxima linha. Como faço para mostrar apenas a última parte do caminho?

Isso é o que eu tenho no meu .bashrc :

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

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PROMPT_COMMAND='echo -ne "3]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}
PS1='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\w\[3[00m\]\$ '

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PROMPT_COMMAND='echo -ne "3]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}%pre%7"'
    ;;
*)
    ;;
esac
7"' ;; *) ;; esac
    
por hsribei 25.10.2009 / 22:38

8 respostas

87

Altere o \w (em minúsculas) para \W (maiúsculas):

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

Dê uma olhada no Bash Prompt HOWTO para obter muitos detalhes divertidos. exemplo:

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

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

user@host:bin$

A variável PROMPT_COMMAND , se definida, é um comando executado antes de exibir o prompt especificado em PS1 . No seu caso, PROMPT_COMMAND executa uma instrução echo com determinadas sequências de escape ANSI que < a href="http://tldp.org/HOWTO/Bash-Prompt-HOWTO/xterm-title-bar-manipulations.html"> manipule a barra de título de um Xterm .

Se você suspeitar que seu PROMPT_COMMAND está substituindo seu prompt PS1 , poderá unset e testar as coisas:

$ unset PROMPT_COMMAND

Por fim, certifique-se de alterar a definição PS1 que realmente é usada. Os locais comuns são /etc/bash.bashrc , /etc/profile , ~/.bashrc , ~/.bash_profile , ~/.profile . Os arquivos do sistema são geralmente (mas nem sempre) executados antes dos arquivos do usuário.

    
por 25.10.2009 / 22:54
12

O comando simples bash replace é

${VAR/pattern_to_find/pattern_to_replace}

Para mostrar o último diretório, você pode fazer apenas ${PWD/*\//} , ou seja, encontrar qualquer coisa antes e incluindo o último ' / ' e substituí-lo por nada.

Na minha máquina Ubuntu eu uso:

export PS1='$(whoami):${PWD/*\//}#'. 
    
por 07.06.2016 / 00:11
3

Minha solução é mostrar os três diretórios top e bottom 2 quando houver mais de 5

Então, meu prompt (que também tem outras informações) se parece com:

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

quando meu pwd é realmente

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

Meu prompt do PS1 é configurado da seguinte forma:

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

git_branch é uma função que mostra o branch git atual, eu mantenho em meus dotfiles, é:

git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)//'
  }
    
por 15.05.2017 / 14:42
3

Minha solução para isso é um pouco diferente em relação a como exportá-lo, então pensei em compartilhá-lo aqui:

Crie outra variável de string de prompt; PS5 e exporte a seguinte string no seu arquivo .profile / .bash_profile :

\u: Display the current username .

\W: Print the base of current working directory.

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

Agora, sempre que você precisar usar o PS abreviado, basta executar: eval $PS5

Ou, melhor ainda, crie um alias no seu arquivo .bash_aliases : (graças a @ muru )

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

source novamente, e agora você pode digitar PS5 para alternar.

    
por 18.08.2018 / 23:13
1

Show only current directory name (not full path) on bash prompt

A maioria das outras soluções não funcionou para mim em todos os meus sistemas operacionais que compartilham meus arquivos de ponto: AIX, Windoze e Linux. As portas bash eram versões antigas que não suportavam certas construções e eu não queria separar outro processo (por exemplo, sed , awk , etc.) que é visivelmente caro no cygwin.

O seguinte é longo, mas de alto desempenho:

# 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)} "

Eu quero que ele cuspa:

/
/usr
/usr/foo
foo/bin

Observe a falta de uma barra na última linha, que é como eu gosto. Além disso, você pode citar os últimos 3 diretórios alterando o argumento para DIR_LAST .

Além disso, tentei fazer isso com um regex e BASH_REMATCH , mas o bash v3 não pareceu gostar dos parens e eu não consegui descobrir como escapar deles adequadamente. Suspiro.

    
por 12.02.2018 / 23:32
0
root:~/project#  -> root:~/project(dev)# 

adicione o seguinte código ao final do seu ~ / .bashrc

force_color_prompt=yes
color_prompt=yes
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/()/'
}
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\w\[3[01;31m\]$(parse_git_branch)\[3[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(parse_git_branch)\$ '
fi
unset color_prompt force_color_prompt
    
por 17.01.2019 / 08:06
0

Aqui está uma ferramenta incrível que fornece uma interface de arrastar / soltar para criar seu próprio prompt bash, que você pode copiar para o seu. bashrc. Use o elemento "Directory (basename)" para mostrar apenas o nome da pasta atual, em vez do caminho inteiro.

    
por 23.04.2019 / 15:17
0

Eu acredito que esta opção é muito mais fácil, simplesmente fazendo:

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

Portanto, atribua isso à variável PS1 em seu arquivo .bashrc:

PS1='$(PWD | rev | cut -d '/' -f 1 | rev)'
    
por 26.05.2017 / 16:17