¿Qué hay de malo en este mensaje de bash?

¿Qué hay de malo en este mensaje de bash?

Utilizo la siguiente entrada en ~/.bashrcel archivo para colorear el mensaje y mostrar la rama actual del repositorio de git:

PS1='\[\e[1;32m\]\[\u@\h\]\[\e[m\] \[\w\]\[\e[1;1m\]\[$(__git_ps1 " (%s)")\] \[\e[1;1m\]\[$\] \[\e[m\]'

Esto funciona casi bien, excepto cuando uso el historial de bash (la tecla de flecha hacia arriba varias veces), la línea de comando queda "sin sangría" (solo los primeros caracteres del mensaje permanecen intactos) y lo visible es:

usemmand

cuando mi nombre de usuario es usery el comando es command.

Respuesta1

\[y \]solo debe usarse alrededor de partes del símbolo del sistema quenoavanzar el cursor, a pesar de tener texto real. Si __git_ps1produce algún resultado visible, esto desincronizará su línea de comando.

Respuesta2

Esta es la versión correcta:

COLOR1="\[\e[1;32m\]"
COLOR2='\[\e[1;1m\]'
COLOR3='\[\e[m\]'
GIT_STATUS=$(__git_ps1 " %s")
PROMPT_CHAR="$"

PROMPT="${COLOR1}\u@\h${COLOR3} \w${COLOR2}${GIT_STATUS} ${COLOR2}${PROMPT_CHAR} ${COLOR3}"
PS1="$PROMPT"
export PS1

Respuesta3

Cualquiera que trabaje con este problema, aquí está el ejemplo que funcionó para mí:

ANTES:

export PS1="\033[0;33m[\u@\h]\033[1m\e[m \w \033[36m[>>]\033[0m\e[m "

DESPUÉS:

export PS1='\[\033[0;34m\][\u@\h]\[\033[1m\e[m\] \w \[\033[35m\][>>]\[\033[0m\e[m\] '

Notas alrededor '\\[\\]'de los colores.

información relacionada