3[1;35m tem 7 caracteres. bash não pode adivinhar que esses 7 caracteres têm realmente uma largura nula. Se não, achará que eles têm 7 colunas de largura.
Ele (ou melhor, readline o editor de linhas subjacente que ele usa) quer saber qual é a posição atual na tela porque está usando sequências de posicionamento do cursor (para cima, baixo, esquerda, direita) para mover o cursor quando você re usando chaves de edição.
Então você precisa dizer qual dos caracteres no prompt não move o cursor. Com bash , isso é feito usando \[...\] , que informa ao shell que o conteúdo tem largura zero.
Observe também que a expansão rápida em bash reconhece \e como um caractere ESC, portanto, você não precisa usar echo -e . Você pode apenas fazer:
PS1='\[\e[1;35m\] blah $ '
Se você tiver que usar echo ou melhor printf , faça:
PS1='\[$(if ...; then printf "$color1"; fi)\] blah $ '
Ou:
PS1='$(if ...; then printf "\[$color1\]"; fi) blah $ '
Em zsh , o equivalente a bash ' \[...\] é %{...%} como tcsh , mas zsh tem diretivas para alterar atributos de caractere, então você preferiria fazer:
PS1='%B%F{magenta}blah $ '
Para o primeiro plano em negrito e magenta. Ele também tem algumas formas de testes condicionais, incluindo $? , portanto, seu erro red , caso contrário, verde poderia ser escrito:
PS1='%F{%(?:green:red%)}blah%f $ '
tcsh tem %B , mas não %F{color} . Então, você usaria:
set prompt = '%{\e[1;35m%}blah $ '
Em ksh88 ou pdksh , você faria:
PS1=$(printf '\r[1;35mblah $ ')
Isso define um caractere (aqui 0x5) como o caractere escape . Então, colocando o texto entre um par deles, você está dizendo ao shell que não é visível. Você pode usar qualquer caractere diferente de 0x5, mas não deve ocorrer em seu prompt e, exceto em mksh, ele deve ser ignorado pelo terminal porque o shell realmente o grava (junto com o caractere CR).
ksh93 usa apenas uma seqüência de posicionamento do cursor: BS (que move o cursor uma coluna para a esquerda). Para ir para a direita, ele apenas redesenha os mesmos caracteres. Portanto, não é necessário saber a posição do cursor, apenas a largura de cada caractere digitado. Isso funciona desde que o terminal esteja sozinho na margem (por isso não funcionará corretamente com este terminator por exemplo). Um efeito colateral se você tiver um prompt com seqüências de controle é que suas paradas de tabulação não serão alinhadas corretamente.



