__git_ps1 (ramificação atual) no prompt do bash está sempre desatualizado

7

Meu PS1 no meu ~/.bash_profile :

export PS1="\n\[3[38;5;246m\]\u@\[3[38;5;245m\]\h\[3[38;5;15m\] \[3[38;5;28m\]\w\[3[38;5;15m\]\[3[38;5;2m\]'__git_ps1'\[3[38;5;15m\] \[3[38;5;90m\]\t\[3[38;5;15m\] \[3[38;5;232m\]\[3[38;5;15m\] \n\[3[38;5;0m\]\$ "

(desculpe, não tenho aliases para meus códigos de cores, criei este aviso com um editor on-line)

O que é um pouco confuso, mas produz um prompt muito bom:

Mas a ramificação atual exibida está sempre errada se eu alternar

Não sei por que isso aconteceria. Se eu executar o comando sozinho, recebo o valor correto.

$ echo '__git_ps1'
(dev)

Se eu utilizar o .bash_profile, o novo valor entrará (mas estará errado na próxima vez que eu alternar). Estou fazendo algo errado?

    
por jcollum 25.11.2015 / 23:59

3 respostas

6
export PS1="…'__git_ps1'…"

Com '__git_ps1' entre aspas duplas, esse comando executa o comando __git_ps1 e atribui sua saída (e outro texto adjacente) à variável PS1 . Assim, seu prompt está mostrando o ramo que foi determinado quando seu .bash_profile foi executado.

Você precisa executar __git_ps1 cada vez que o bash exibir um prompt. (Na verdade, você não precisa executá-lo novamente até que as informações do git tenham sido alteradas, mas isso é difícil de detectar.) Há duas maneiras de fazer isso.

  • Inclua o texto literal '__git_ps1' na variável PS1 . Certifique-se de que o bash esteja configurado para executar expansões de shell na string de prompt, com o promptvars option ativado; esse é o caso por padrão, mas pode ser desativado com shopt -u promptvars .

    PS1='\n\[…\]$(__git_ps1)\[…\]\$ '
    
  • Atualize o conteúdo do prompt por meio de um comando executado no PROMPT_COMMAND variável.

    update_PS1 () {
      PS1="\n\[…\]$(__git_ps1)\[…\]\$ "
    }
    shopt -u promptvars
    PROMPT_COMMAND=update_PS1
    

A propósito, o prompt é uma configuração de shell, não uma configuração global, então você deve configurá-lo em ~/.bashrc , não em ~/.bash_profile .

    
por 26.11.2015 / 01:16
5

É apenas uma questão simples de citar. Altere '__git_ps1' para \$(__git_ps1) ou, se você precisar usar backticks: \'__git_ps1\' .

Para convencer-se basta mudar o seu PS1 para (abrir uma nova instância do shell, se você quiser voltar à sua configuração anterior):

$ PS1="$(date) >"
Thu Nov 26 20:02:34 EST 2015 >_

O único problema é que não será atualizado (espere alguns segundos para pressionar enter).

Mas isso vai:

$ PS1="\$(date) >"
Thu Nov 26 20:06:20 EST 2015
Thu Nov 26 20:06:25 EST 2015

Isso é tudo. escreva exit . (atualize seu prompt) Volte ao trabalho.

    
por 27.11.2015 / 01:07
1

link

Observe na parte inferior que eles não definiram:

export PS1="\ n ... '__git_ps1 ...

O conjunto para este pedaço de trabalho doente:

export PS1=$IBlack$Time12h$Color_Off'$(git branch &>/dev/null;\

if [ $? -eq 0 ]; then \
  echo "$(echo 'git status' | grep "nothing to commit" > /dev/null 2>&1; \
  if [ "$?" -eq "0" ]; then \
    # @4 - Clean repository - nothing to commit
    echo "'$Green'"$(__git_ps1 " (%s)"); \
  else \
    # @5 - Changes to working tree
    echo "'$IRed'"$(__git_ps1 " {%s}"); \
  fi) '$BYellow$PathShort$Color_Off'\$ "; \
else \
  # @2 - Prompt when not in GIT repo
  echo " '$Yellow$PathShort$Color_Off'\$ "; \
fi)'

Os bits relevantes são "$ (__ git_ps1" (% s) "ou" $ (__ git_ps1 "{% s}"

    
por 26.11.2015 / 00:28

Tags