Caracteres não imprimíveis aparecendo no prompt do terminal

Caracteres não imprimíveis aparecendo no prompt do terminal

Sem cor meu prompt fica assim:

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

Eu adiciono um pouco de cor e \[... \]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\$

Alerta original

Parece ótimo! Mas oBashFAQdestaca que:

Os \[ \] só são especiais quando você atribui PS1, se você imprimi-los dentro de uma função que roda quando o prompt é exibido ela não funciona. Neste caso você precisa usar os bytes \001 e \002

No entanto, quando mudo meu prompt para usar \001e, \002em vez disso, recebo isto (o StackExchange parece renderizá-los corretamente como caracteres de largura zero, mas eles estão lá):

[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\$

Prompt novo e quebrado

Este mesmo prompt - com \001... \002- parece correto no iTerm2 no OSX.

Estou usando estes dois comandos para escapar das sequências de cores:

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

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

O que devo fazer em vez da segunda opção para usar \001... \002no Ubuntu?

informação relacionada