Problema de PS1, CLI en mal estado

16

Hice una simple tarea de PS1

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

Todo lo que quería hacer era cambiar el color del indicador y mostrar solo la ruta relativa. Sin embargo, esto arruina la CLI. Por ejemplo, cuando explora el historial con el recorte y se superpone a la pantalla. Cuando escribo un comando largo, el cursor se mueve al comienzo de la pantalla superpuesto con la pantalla de solicitud. ¿Qué he hecho mal?

yayu
fuente

Respuestas:

30

Esto se debe a que bash cree que la solicitud es más larga de lo que es. La secuencia de escape, \e[0;31mpor ejemplo, es absorbida por la terminal, que a su vez convierte el siguiente texto en rojo, pero bash no lo sabe. Por lo tanto, debe decirle a bash que esa secuencia de caracteres no debe contarse en la longitud del indicador, y lo hace al encerrarla \[ \]. También recomiendo usar tput en lugar de codificar secuencias de escape de terminal.

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

Consulte la introducción de BashFAQ 53 y los códigos de terminal (ANSI / VT100) para obtener más información.

geirha
fuente
1
Gracias por su descripción perfecta. Tuve este problema varias veces y nunca sé dónde estaba el problema.
Betlista
+1, lo mismo aquí. Para aquellos que ciegamente probar esta solución y no funciona, vale la pena mencionar aquí que hay otra sintaxis descrita en el enlace BashFAQ para escapar de colores dentro de las funciones, \001 \002.
Stephen Niedzielski