¿Por qué este indicador de bash a veces mantiene parte de los comandos anteriores al desplazarse por el historial?

¿Por qué este indicador de bash a veces mantiene parte de los comandos anteriores al desplazarse por el historial?

Mi indicador de bash, que admito que lo robé de algunos lugares y lo improvisé, a veces agrega parte de los comandos anteriores a su longitud al desplazarme por el historial de bash con las flechas hacia arriba/abajo.

Por ejemplo, si mis comandos anteriores fueran:

ls
cd /home/caleb
vim .bashrc

Cuando estaba en mi mensaje y me desplacé hacia arriba dos veces, podría verse así:

$ vim .bcd /casa/caleb

Donde los primeros cinco caracteres sobran del último comando.

¿Alguien tiene alguna idea de por qué sucede esto y cómo se puede detener?

Mi mensaje está configurado con este código (demasiado largo para incluirlo aquí):https://gist.github.com/1679352

Respuesta1

En algún lugar su mensaje es fubar. Lo que suele suceder es que su shell cree que está generando códigos de términos no imprimibles y espera que ocupen espacio. El mejor consejo que puedo darle es agregar (o quitar) sistemáticamente su mensaje hasta que este comportamiento se detenga para aislar el código que está causando este problema.

Respuesta2

Los códigos de color deben estar entre corchetes. Los corchetes informan a bash que el texto adjunto no debe imprimirse

Basado en el ejemplo de @Pheditor, esto muestra que cualquier formateo realizado después de la nueva línea dará como resultado el problema original:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\033[0;90m\$ "

envolver el código de formato en [] garantiza que nunca ocurra un comportamiento molesto:

export PS1="\n\[\[\033[01;33m\][\w]\[\033[00m\]\n\[\033[0;90m\]\$ "

La documentación:http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html

Dado que el formato PS1 hace que el valor sea muy largo y difícil de leer, pongo los códigos de formato en variables:

BYELLOW='\[\033[01;33m\]'
IBLACK='\[\033[0;90m\]'
PS_CLEAR='\[\033[0m\]'
export PS1="\n${BYELLOW}[\w]${PS_CLEAR}\n${IBLACK}\$ "

Respuesta3

Tuve el mismo problema y estaba relacionado con las definiciones de color.

En mi caso, tengo un mensaje de varias líneas (da más espacio para el comando actual independientemente de la longitud de la ruta que se muestra en el mensaje).

Mala versión:

export PS1="\n\n\[\033[01;33m[\w]\n\033[00m\$ "

Buena versión:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\$ "

\033[00mtermina el color. Si está después de la nueva línea ( \n), impide volver a dibujar correctamente en la terminal para sobrescribir los comandos anteriores con el color de fondo. Moverlo detrás de la nueva línea resolvió el problema.

(usando Terminal en Mac OS 10.8)

Respuesta4

Yo estaba con este problema. ¿Qué detecté?

Cuando tiene colores dentro de la variable PS1 (por ejemplo: "\e[35m" ), SIEMPRE debe estar rodeado por "\[" y "\]" (por ejemplo: "\[\e[35m\]" ).

Cuando marqué todos los colores en PS1 según esta regla, ¡funcionó!

No más problemas al desplazarse por el historial de bash.

MAL EJEMPLO:PS1="\e[0;36m[\u@\h[\e[1;31m$ORACLESID\e[0;36m] \W]\e[0m"; exportar PS1

BUEN EJEMPLO:PS1="\[\e[0;36m\][\u@\h[\[\e[1;31m\]$ORACLESID\[\e[0;36m\]]\W]\[\e [0m\] "; exportar PS1

información relacionada