Novo prompt do bash causando problemas

5

Alterei meu prompt bash para isso:

PS1="\[3[1;31m[\[3[1;33m\$(date +%H:%M)\[3[1;31m] \u:\[3[1;32m\W\[3[1;37m\$\[3[0m\] "

Desculpe pela longa fila, é principalmente devido a cores. Basicamente, quando eu acertar a seta para cima para voltar no histórico de Bash, o prompt desaparece e tudo estraga. É semelhante a esta questão mas não sei se um \[  está faltando e onde.

    
por rubik 14.08.2012 / 19:20

3 respostas

9

Vamos limpá-lo um pouco e torná-lo mais portátil. Em geral, é melhor usar tput para gerar as seqüências de controle em vez de codificá-las, conforme descrito em FAQ 53 de Bash . Desta forma, é muito mais fácil encontrar o seu \] em falta.

red=$(tput setaf 1)
green=$(tput setaf 2)
yellow=$(tput setaf 3)
white=$(tput setaf 7)
reset=$(tput sgr0)
PS1="\[$red\][\[$yellow\]\A\[$red\]] \u:\[$green\]\W\[$white\]\$\[$reset\] "

Observe que substituí sua invocação de date pelo prompt de escape interno \A que exibe a mesma coisa (24 horas em HH:MM format).

Há uma ressalva com essa abordagem, conforme descrito na FAQ relacionada ao Bash, em que a saída seria distorcida se alguma das seqüências de controle tput gerasse algo que contivesse uma fuga de prompt. Eu nunca encontrei esse problema, então eu geralmente o ignoro.

    
por 14.08.2012 / 19:27
4

Você desequilibrou seus \[ e \] . As sequências de controle precisam ser agrupadas nelas, de modo que o bash saiba que elas não ocupam realmente nenhum espaço em seu terminal.

Tente isto:

PS1="\[3[1;31m\][\[3[1;33m\]\$(date +%H:%M)\[3[1;31m\]] \u:\[3[1;32m\]\W\[3[1;37m\]\$\[3[0m\] "

A solução do @jw013 é ainda melhor, embora seja muito mais limpa.

    
por 14.08.2012 / 19:29
0

A tabela ASCII tem uma referência de cores, negrito, itálico e etc.

    
por 16.08.2012 / 11:49

Tags