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

71

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

Isto é o que eu tenho no meu .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
hsribei
fonte

Respostas:

98

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

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

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

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$

A PROMPT_COMMANDvariável, se definida, é um comando executado antes de exibir o prompt especificado em PS1. No seu caso, PROMPT_COMMANDexecuta uma echoinstrução com determinadas seqüências de escape ANSI que manipulam a barra de título de um Xterm .

Se você suspeitar que seu pedido PROMPT_COMMANDestá sobrescrevendo PS1, você pode unsettestá-lo:

$ unset PROMPT_COMMAND

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

charlatão quixote
fonte
Hum ... receio que já esteja \ w, mas parece que essa casedeclaração a substitui quando estou em um xterm, e o problema parece estar com PWDa PROMPT_COMMANDlinha. Você sabe o que devo colocar lá?
hsribei
4
\w(minúscula) define como caminho completo, \W(maiúscula) apara o bit final. o PROMPT_COMMAND está definindo o título da janela em um xterm. verifique sua variável TERM; se não começar com "xterm" ou "rxvt", PROMPT_COMMAND nem será executado.
quack quixote
Ah, sim, duh. Desculpe, eu misturei letras maiúsculas e minúsculas. Isso funcionou. Obrigado! :)
hsribei 25/10/2009
Ótima resposta. Certifique-se de reiniciar para que isso entre em vigor. Obrigado!
Combine
14

O comando simples substituir bash é

${VAR/pattern_to_find/pattern_to_replace}

Para mostrar o último diretório, você pode simplesmente fazer ${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/*\//}#'. 
stopBugs
fonte
11
Gosto mais desta resposta do que a aceita porque é genérica para qualquer situação, em vez de apenas a lógica de análise especial de $ PS1. Menos ferramentas mais poderosas são mais fáceis de lembrar e compor. :)
David Ellis
4

Minha solução é mostrar os três primeiros e os dois últimos diretórios quando houver mais de 5

Portanto, 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 está configurado da seguinte maneira:

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 é uma função que mostra o ramo git atual, eu o mantenho em meus arquivos de ponto, é:

git_branch () {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
  }
Michael Durrant
fonte
Isso é incrível! Muito obrigado por esta resposta.
Carlos F
4

Minha solução para isso é um pouco diferente no que diz respeito à exportação, 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 : exibe o nome de usuário atual.

\ W : imprime a base do diretório de trabalho atual.

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

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


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

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

sourcenovamente e agora você pode apenas digitar PS5para alternar.

U-maneiras
fonte
11
Parece uma frankenalias. Por que não usar apenas um alias ou uma função?
Muru
1

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

A maioria das outras soluções não funcionou para mim em todos os meus SOs que compartilham meus arquivos de ponto: AIX, Windoze e Linux. As portas festança eram versões antigas que não suportam certas construções e eu não queria desembolsar outro processo (ou seja sed, awk, etc.), que é visivelmente caro sob cygwin.

O seguinte é longo, mas com bom 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 cuspir:

/
/usr
/usr/foo
foo/bin

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

Além disso, tentei fazer isso com um regex, BASH_REMATCHmas o bash v3 não parecia gostar dos parênteses e não conseguia descobrir como escapar deles adequadamente. Suspiro.

cinzento
fonte
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 no seu arquivo .bashrc:

PS1='$(PWD | rev | cut -d '/' -f 1 | rev)'
Dani Mach
fonte
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/* \(.*\)/(\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
Ali Alp
fonte