A sugestão do @ i_am_root de colocar \[ e \] dentro da definição de red e similares é boa. No entanto, por this , o bash processa apenas \[ e \] em PS1 , não no texto incluído em PS1 por $() . Portanto, use e 1\x012\x02 (ou red e \[ ) dentro de \] e similares em vez de e %code% . 12%code%21
Observação: por esta resposta , somente os códigos de escape devem estar em %code% e %code% . O texto que ficará visível para o usuário deve estar fora do %code% e %code% , de modo que o bash saiba que ocupa espaço na tela e pode ser responsável por isso ao redesenhar.