El aviso Custom Bash se sobrescribe a sí mismo

Estoy usando el prompt bash personalizado para mostrar la twig git.

Todo está en /etc/bash/bashrc :

 function formattedGitBranch { _branch="$(git branch 2>/dev/null | sed -e "/^\s/d" -e "s/^\*\s//")" # tried these: echo -e "\e[0;91m ($_branch)" echo -e "\e[0;91m ($_branch) \e[m" echo -e $'\e[0;91m'"($_branch)" echo "($_branch)" echo "$(tput setaf 2) ($_branch) $(tput setaf 9)" printf "\e[0;91m ($_branch)" } # color is set before function call PS1='\[\033[01;34m\] \[\033[0;91m\]$(formattedGitBranch) \$\[\033[00m\] ' # color is set inside function PS1='\[\033[01;34m\] $(formattedGitBranch) \$\[\033[00m\] ' 

El problema es que cuando configuro el color para $_branch en la función, mi mensaje se sobrescribirá cuando se scope la EOL:

mmmmmmmmmmmmp / rainyday.js (master) $ mmmmmmmm

tput todas las variantes posibles tput , printf , $'' notación.

Resolví el problema configurando el color solo en PS1 :

ad @ gentoo /tmp/rainyday.js (master) $ mmmmmmm

Pero..

  1. Me gustaría saber por qué está sobrescribiendo mi mensaje
  2. Cómo solucionar este problema cuando se usa la función

Estoy usando Gentoo Linux. GNU bash, verze 4.2.37(1)-release (i686-pc-linux-gnu)

1) Me gustaría saber por qué está sobrescribiendo mi mensaje

Debido a que todos los caracteres no imprimibles tienen que ser escapados por \[ y \] contrario readline no puede hacer un seguimiento de la posición del cursor correctamente.

Debe poner \[ y \] alrededor de las secuencias de escape que no sean de impresión en su mensaje.
Sin \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

\[ Comience una secuencia de caracteres que no sean de impresión. (como secuencias de escape de color). Esto permite a bash calcular el ajuste de palabras correctamente.

\] Finaliza una secuencia de caracteres no imprimibles. – BashFAQ

… tenga en cuenta los escapes de los caracteres que no se imprimen, estos aseguran que readline pueda hacer un seguimiento de la posición del cursor correctamente. – ss64.com

2) Cómo solucionar este problema cuando se usa la función

Si realmente necesita / desea establecer colores dentro de la función cuyo resultado se utiliza en PS , tiene 2 opciones:

  • PS1='\[ $(formattedGitBranch) \] '

  • escapa de caracteres no imprimibles dentro del echo con \001 \002 (gracias a la gravedad )!

echo -e no tiene conocimiento de bash’s \[ \] por lo que debe sustituirlos por códigos de control ASCII \001 y \002 para delimitar los caracteres no imprimibles de imprimible:

 function formattedGitBranch { echo -e "\001\e[0;91m\002 ($_branch)"; } PS1='$(formattedGitBranch) ' 

Cadenas como \e[0;91m necesitan \e[0;91m adicionales para evitar que bash calcule su longitud.

Adjunte estas cadenas desde formattedGitBranch en \[ & \] como, \[\e[0;91m\]

Lo has hecho correctamente en otros lugares. Solo me lo perdí en formatoGitBranch.

Tienes que ocuparte de los caracteres no imprimibles dentro de [\ y /]; de lo contrario, podrías tener el cursor justo encima del símbolo del sistema como compartido en la pregunta, así que encontré algo y simplemente lo compartí: –

Para obtener el cursor después de la salida de PS1 en la misma línea:

Después

algunos ejemplos:

 PS1='[\u@\h:\w]\$ PS1='[\[\033[0;32m\]\u@\h:\[\033[36m\]\W\[\033[0m\]]\$ ' 

Refer Link: syntax para bash PS1