Por que esse prompt do bash às vezes mantém parte dos comandos anteriores ao rolar o histórico?

Por que esse prompt do bash às vezes mantém parte dos comandos anteriores ao rolar o histórico?

Meu prompt do bash, que admito ter roubado de alguns lugares e remendado, às vezes adiciona parte dos comandos anteriores ao seu comprimento ao rolar o histórico do bash com as setas para cima/para baixo.

Por exemplo, se meus comandos anteriores fossem:

ls
cd /home/caleb
vim .bashrc

Quando eu estava no meu prompt e rolei para cima duas vezes, poderia parecer:

$ vim.bcd /home/caleb

Onde os primeiros cinco caracteres sobraram do último comando.

Alguém tem alguma ideia de por que isso está acontecendo e como pode ser interrompido?

Meu prompt está definido com este código (muito longo para incluir aqui):https://gist.github.com/1679352

Responder1

Em algum lugar seu prompt é fubar. O que geralmente acontece é que seu shell pensa que está gerando códigos de termos não imprimíveis e esperando que ocupem espaço. O melhor conselho que posso dar é adicionar (ou retirar) sistematicamente seu prompt até que esse comportamento pare para isolar o código que está causando o problema.

Responder2

Os códigos de cores precisam ser colocados entre colchetes. Os colchetes informam ao bash que o texto incluído não deve ser impresso

com base no exemplo do @Pheditor, isso mostra que qualquer formatação feita após a nova linha resultará no problema original:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\033[0;90m\$ "

agrupar o código de formato em [] garante que um comportamento irritante nunca aconteça:

export PS1="\n\[\[\033[01;33m\][\w]\[\033[00m\]\n\[\033[0;90m\]\$ "

A documentação:http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html

Como a formatação PS1 faz com que o valor seja muito longo e difícil de ler, coloquei os códigos de formato em variáveis:

BYELLOW='\[\033[01;33m\]'
IBLACK='\[\033[0;90m\]'
PS_CLEAR='\[\033[0m\]'
export PS1="\n${BYELLOW}[\w]${PS_CLEAR}\n${IBLACK}\$ "

Responder3

Eu tive o mesmo problema e estava relacionado às definições de cores.

No meu caso, tenho um prompt de várias linhas (dá mais espaço para o comando atual, independentemente do comprimento do caminho exibido pelo prompt).

Versão ruim:

export PS1="\n\n\[\033[01;33m[\w]\n\033[00m\$ "

Boa versão:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\$ "

\033[00mtermina a cor. Se estiver após a nova linha ( \n), impede o redesenho adequado no terminal, para sobrescrever os comandos anteriores com a cor de fundo. Movê-lo para trás da nova linha resolveu o problema.

(usando Terminal no Mac OS 10.8)

Responder4

Eu estava com esse problema. O que eu detectei?

Quando você tem cores dentro da variável PS1 (ex: "\e[35m" ) ela SEMPRE deve estar rodeada por "\[" e "\]" (ex: "\[\e[35m\]" ).

Quando marquei todas as cores no PS1 de acordo com esta regra, funcionou!

Não há mais problemas com a rolagem do histórico do bash.

MAU EXEMPLO:PS1="\e[0;36m[\u@\h[\e[1;31m$ORACLESID\e[0;36m] \W]\e[0m"; exportar PS1

BOM EXEMPLO:PS1="\[\e[0;36m\][\u@\h[\[\e[1;31m\]$ORACLESID\[\e[0;36m\]]\W]\[\e [0m\]"; exportar PS1

informação relacionada