Caracteres que no se imprimen aparecen en el mensaje del terminal

Caracteres que no se imprimen aparecen en el mensaje del terminal

Sin color, mi mensaje se ve así:

[0] [dimo414@dimo414:/tmp]
$ echo $PS1 | sed 's/\x1b/\\e/g'
\n[0] [dimo414@dimo414:/tmp]\n\$

Le agrego un poco de color y \[... \]lo delimito:

[0] [dimo414@dimo414:/tmp]
$ echo $PS1 | sed 's/\x1b/\\e/g'
\n[\[\e[32m\]0\[\e[0m\]] [\[\e[34m\]dimo414\[\e[0m\]\[\e[32m\]@dimo414\[\e[0m\]:\[\e[94m\]/tmp\[\e[0m\]]\n\$

Aviso original

¡Se ve muy bien! Pero elBashPreguntas frecuentesseñala que:

Los \[ \] solo son especiales cuando asignas PS1, si los imprimes dentro de una función que se ejecuta cuando se muestra el mensaje, no funciona. En este caso necesitas usar los bytes \001 y \002.

Sin embargo, cuando cambio mi mensaje para usar \001y \002en su lugar, aparece esto (StackExchange parece representarlos correctamente como caracteres de ancho cero, pero están ahí):

[0] [dimo414@dimo414:/tmp]
$ echo $PS1 | sed 's/\x1b/\\e/g'
\n[\e[32m0\e[0m] [\e[34mdimo414\e[0m\e[32m@dimo414\e[0m:\e[94m/tmp\e[0m]\n\$

Mensaje nuevo y roto

Este mismo mensaje, con \001... \002, parece correcto en iTerm2 en OSX.

Estoy usando estos dos comandos para escapar de las secuencias de colores:

# Previously (works)
printf '\[%s\]' "$(color "$@")"

# Currently (doesn't work on Ubuntu)
printf '\001%s\002' "$(color "$@")"

¿Qué debería hacer en lugar de la segunda opción para poder usar \001... \002en Ubuntu?

información relacionada