O problema seria que (grifo meu, do manual do bash ):
% bl0ck_qu0te% Assim, o \[ na saída da sua função chega tarde demais para informar ao Bash que os códigos de controle são seguidos. Você precisa definir PS1 com a saída da função incluída para que isso funcione. Eu sugiro usar PROMPT_COMMAND assim:
PROMPT_COMMAND='PS1="${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]('batPer')-\A:\[3[01;34m\]\w\[3[00m\]\$ "'
Note como as aspas internas são aspas duplas, então cada vez que PS1 é setado, a saída da função é adicionada a ele, e então Bash decodifica PS1 para exibir o prompt.
Nota: com isso, você não precisa echo -e da saída. Antes, você precisava disso para cores, já que o Bash não estava interpretando depois da expansão da string PS1 . Agora, o Bash decodificará os códigos de controle também.