Eu dou meu git
prompt colorido, mas nunca funciona totalmente. Depois de tantas trilhas, marquei o ponto onde está o problema (completamente eliminado git
do problema). Aqui está, manifestando o sintoma da forma mais simples possível:
- Acompanhando o bash: Prompt colorido e linha de comando longa , preciso fechar as sequências de escape
\]
para que 'readline' calcule corretamente o comprimento visível do prompt - Funciona com
PS1
configuração estaticamente , mas não dinamicamente :
echo -e '\e[33m\]00\e[0m\]' | tee /tmp/p
PS1="\n\w`cat /tmp/p`\\\$ "
PS1='\n\w`cat /tmp/p`\\\$ '
echo -e '\[\e[33m\]00\[\e[0m\]' | tee /tmp/p
Parece que Bash(+readline) detecta
\[
e antes que\]
aPS1
substituição de comando (`cat /tmp/p`
) seja expandida. Se\[
ou\]
aparecem por causa de uma substituição, é tarde demais para terem o efeito desejado e aparecem literalmente.Não exatamente. Formalmente
PS1
(a variável) é estática em ambos os casos. No caso de aspas duplas,`cat /tmp/p`
a variável contém o resultado da substituição do comando obtido uma vez durante a atribuição. No caso de aspas simples`cat /tmp/p`
, a variável contém esta string literal. Em ambos os casos, o valor da variável é fixo depois de atribuído, não muda automaticamente.Ainda assim, quando o shell interpreta o último valor estático com a finalidade de imprimir o prompt, ele se expande
`cat /tmp/p`
. Portanto, o prompt é realmente dinâmico neste caso, mas não a variável.A solução é tornar a variável verdadeiramente dinâmica, ou seja, fazer com que algo atualize seu valor toda vez antes de o shell precisar da variável. O valor deve conter o resultado de
`cat /tmp/p`
, então todos\[
e\]
(incluindo estes de/tmp/p
) estão lá quando o shell começa a interpretar o valor.Isso pode ser feito com
PROMPT_COMMAND
.( fonte )
Exemplo: