Problema PS1, atrapalhando a CLI

16

Eu fiz uma tarefa simples no PS1

PS1="\e[0;31m[\W]\$ \e[m "

Tudo o que eu queria fazer era mudar a cor do prompt e exibir apenas o caminho relativo. No entanto, isso atrapalha a CLI. Por exemplo, ao navegar no histórico com o mesmo, corta e sobrepõe a exibição. Quando digito um comando longo, o cursor se move para o início da tela, sobrepondo-se ao próprio prompt. O que eu fiz errado?

yayu
fonte

Respostas:

30

Isso ocorre porque o bash acha que o prompt é mais longo do que é. A sequência de escape, \e[0;31mpor exemplo, é sugada pelo terminal, que, por sua vez, torna o texto a seguir vermelho, mas o bash não sabe disso. Então, você tem que dizer bash que essa seqüência de caracteres não deve ser contado no comprimento do alerta, e você faz isso, colocando-o em \[ \]. Também recomendo usar tput em vez de sequências de escape de terminal codificadas.

red=$(tput setaf 1)
reset=$(tput sgr0)
PS1='\[$red\][\W]\$\[$reset\] '

Consulte a introdução do BashFAQ 53 e códigos de terminal (ANSI / VT100) para obter mais informações.

Geirha
fonte
11
Obrigado pela sua descrição perfeita. Eu tive esse problema várias vezes e nunca sabe onde estava o problema.
Betlista
+1, o mesmo aqui. Para aqueles que testam cegamente esta solução e ela não funciona, vale a pena mencionar aqui que há outra sintaxe descrita no link BashFAQ para escapar cores nas funções \001 \002,.
Stephen Niedzielski