prompt bash colorido sobrescreve a saída do comando anterior se a saída não terminar com uma nova linha

4

No meu sistema, ao usar um prompt colorido, a última linha da saída do comando anterior é sobrescrita se o último caractere da saída não for uma nova linha.

Ex: Usando o prompt bash padrão, não colorido, temos:

[myusername@myhostname dirname]$ echo -n foo-bar
foo-bar[myusername@myhostname dirname]$

Isso é esperado.

No entanto, usando o seguinte prompt colorido:

PS1='\[3[1;32m\]\u@\h\[3[0m\]:\[3[1;34m\]\w\[3[0m\]\$ '

temos (mostrado aqui sem a cor):

myusername@myhostname:~/path/to/dirname$ echo -n foo-bar
myusername@myhostname:~/path/to/dirname$ rname$ 

O cursor está agora localizado no último "r" na linha. Digitar alguns caracteres no prompt sobrescreve o último "nome $". O resultado final é que, se a saída do comando anterior não terminar em uma nova linha, não consigo ver o que é. Essa é a coisa mais importante para consertar. A forma como os caracteres extras aparecem, mas são mais que graváveis, não me incomoda muito, mas também seria bom corrigir.

Eu tentei isso com outros prompts coloridos da documentação do bash e alguns prompts coloridos de outras respostas de superusuário sobre prompts coloridos, e todos eles se comportam exatamente da mesma maneira.

$ bash --version
GNU bash, version 3.1.17(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

Não tenho certeza, mas acho que é o CentOS, não sei qual versão. Me dê um comando para verificar o O.S., e eu vou executá-lo.

    
por Eddified 22.06.2012 / 23:25

1 resposta

4

Minha solução preferida é simplesmente ter o prompt sempre começar com uma nova linha. Dessa forma eu sempre tenho uma linha em branco entre a saída do último comando (exceto neste caso, é claro), o que parece mais natural para mim. E o pior caso é que, em vez de sobrescrever o texto como você está vendo, eu não entendo a linha em branco. A menos que você experimente por um tempo e simplesmente não consiga suportar a linha em branco, eu recomendo strongmente.

PS1='\n\[3[1;32m\]\u@\h\[3[0m\]:\[3[1;34m\]\w\[3[0m\]\$ '

Uma sugestão adicional, se você quiser: também uso um prompt de várias linhas para tornar minha linha de comando o maior tempo possível antes de finalizar (ou rolar se seu terminal ou shell estiver configurado para isso). Eu também gosto de saber o número da linha do histórico. Aqueles dois juntos:

PS1='\n\[3[1;32m\]\u@\h\[3[0m\]:\[3[1;34m\]\w\[3[0m \!\]\n\$ '

Por fim, também gosto de imprimir timestamps antes e depois de executar comandos. Uma versão simplificada do que eu uso para isso é:

export PROMPT_COMMAND="date +\"%Y-%m-%d %H:%M:%S (%s)\"; trap 'date +\"%Y-%m-%d %H:%M:%S (%s)\"; trap DEBUG' DEBUG"

Cabeça girando ainda? :)

    
por 23.06.2012 / 00:09