Indicador de bash con caracteres de control de ancho cero

Indicador de bash con caracteres de control de ancho cero

Para evitar que el mensaje se deforme en el texto de derecha a izquierda, quiero insertar un LRM de ancho cero en el mensaje de bash (U200e). Como se trata de un carácter de ancho cero, mi instinto fue envolverlo con \[<200e>\]. Resulta que eso en realidad hace que bash ajuste la línea en el lugar equivocado. Cuando no lo envuelvo con nada,entoncesParece que funciona bien.

Lo cual no entiendo. Incluso si bash detecta automáticamente que este carácter tiene un ancho cero, envolverlo \[...\]con a no debería haber dañado nada.

EDITADO: Entonces la pregunta es: cuándo es \[...\]realmente necesario escapar y cómo puede ser dañino si los caracteres de los que escapa tienen en realidad un ancho cero.

Respuesta1

Ver la publicación Escapar de caracteres de longitud cero en bash. y específicamente el respuesta de Michael Allen que reproduzco a continuación:

\[Algunas utilidades, incluida PS1, utilizan las secuencias para representar los códigos de control \001y :\002

\[=> \x01o\001

\]=> \x02o\002

printf y echo no hacen esta traducción de \[a \001.

Entonces la solución fue hacer la conversión yo mismo. En lugar de ajustar caracteres de longitud cero en \[:

echo "\[\033[1;30m\]foo\[\033[0m\]"

que daría salida\[foo\]

En su lugar, genero el código de control real:

echo "\x01\033[1;30m\x02foo\x01\033[0m\x02"

que sale footanto en PS1 printf como en echo.

Para un ejemplo concreto vereste compromiso en git-radar.

información relacionada