bash - personalizar - linux prompt colors
El aviso Custom Bash se sobrescribe a sí mismo (3)
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 gravity )!
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) ''
Estoy usando el prompt bash personalizado para mostrar la rama 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 alcance la EOL:
tput
todas las variantes posibles tput
, printf
, $''''
notación.
Resolví el problema configurando el color solo en PS1
:
Pero..
- Me gustaría saber por qué está sobrescribiendo mi mensaje
- 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)
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:
algunos ejemplos:
PS1=''[/u@/h:/w]/$
PS1=''[/[/033[0;32m/]/u@/h:/[/033[36m/]/W/[/033[0m/]]/$ ''
Refer Link: sintaxis para bash PS1