Eu tenho um problema em que, se eu digitar comandos muito longos no bash, o terminal não renderizará o que estou digitando corretamente. Eu esperaria que, se tivesse um comando como o seguinte:
username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com
O comando deve renderizar em duas linhas. Em vez disso, ele geralmente se espalha e começa a escrever por cima do meu prompt, mais ou menos assim:
myreallylongusername@something.somelongserver.comh -i /path/to/private/key
Se eu decidir voltar e alterar algum argumento, não há como dizer onde o cursor aparecerá, às vezes no meio do prompt, mas geralmente na linha acima de onde estou digitando.
Diversão adicional acontece quando quando eu Uppara um comando anterior. Eu tentei isso no gnome-terminal e terminator e no i3 e Cinnamon. Alguém sugeriu que era o meu prompt, então aqui está:
\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
Ctrll,, reset
e clear
todos fazem o que dizem, mas quando digito o comando novamente, ou Upacontece o mesmo.
Eu verifiquei e checkwinsize
está ativado no bash. Isso acontece em 80x24 e em outros tamanhos de janela.
Isso é apenas algo que eu aprendo a conviver? Existe algum pedaço de magia que eu deveria saber? Decidi usar apenas um prompt muito curto, mas isso não resolve o problema.
env -i bash --norc
corrige-o. As combinações $ COLUMNS e $ LINES. Isso significa que há algo engraçado no meu .bashrc?\[\033[01;32m\]\u: \[\033[01;34m\]\W \[\033[01;34m\] \$ \[\033[0m\]
parece evitar a estranheza no comportamento -, mas não sei se ele respeita o seu prompt de originais completamente ...tput smam
Respostas:
Seqüências não imprimíveis devem estar entre
\[
e\]
. Olhando para o seu PS1, ele tem uma sequência não revelada depois\W
. Mas, a segunda entrada é redundante e repete a instrução anterior "1; 34" .Como tal, isso deveria ter a intenção de colorir:
Manter o "original" também deve funcionar:
Editar:
A razão para o comportamento é porque
bash
acredita que o prompt é mais longo do que realmente é. Como um exemplo simples, se alguém usar:Acredita-se que o prompt tenha 8 caracteres e não 1. Como tal, se a janela do terminal tiver 20 colunas, depois de digitar 12 caracteres, acredita-se ter 20 caracteres e contornar. Isso também é evidente se alguém tentar fazer backspace ou Ctrl+u. Para na coluna 9.
No entanto, ele também não inicia uma nova linha, a menos que esteja na última coluna, como resultado, a primeira linha é substituída.
Se alguém continuar digitando, a linha deve passar para a próxima linha após 32 caracteres.
fonte
Tem a ver principalmente com o tamanho da janela assumida pelo terminal não é o mesmo que o tamanho real da janela. Se você estiver usando o bash, tente isso.
Se você não receber
Em seguida, ative-o com
Em seguida, tente executar outro comando (como
ls
) ou redimensionar a janela uma vez, o acima funciona para mim o tempo todo.Para os sistemas Redhat, em particular, o problema geralmente é causado pela configuração incorreta
~/.bashrc
para não ligar/etc/bashrc
. Normalmente, o bash carrega o~/.bashrc
que é esperado chamar/etc/bashrc
, que por padrão contémshopt -s checkwinsize
.fonte
/etc/bashrc
, tudo o mais estava bom ... Acontece que essa é a causa dos problemas de empacotamento.shopt -s checkwinsize
na sessão ssh. Mas a embalagem persiste.Como mencionado em outras respostas, sequências não imprimíveis como
\e[0;30m
devem ser envolvidas\[...\]
.Além disso (e o que ainda não vi mencionado), parece que ele
\r\n
deve estar fora do\[...\]
se você tiver um prompt de várias linhas. Levei algumas tentativas e erros para finalmente descobrir isso.fonte
Uma vez eu li em algum lugar (não sei mais onde) que usar
\001
e ao\002
invés de\[
e\]
pode resolver esse problema. Isso fez por mim.A propósito, definir PS1 não precisa parecer feio.
fonte
Isso soa como um problema nas configurações da variável
COLUMNS
&LINES
ambiente. Quando você redimensionar a janela eles estão tipicamente definido automaticamente pelo gnome-terminal (creio eu) você pode forçá-los a ser definido manualmente, emitindo o comandoresize
.Exemplo
Se eu redimensionar meu terminal gnome para 79x17, minhas variáveis aparecerão assim:
Eu posso forçá-lo assim:
fonte
Para evitar quebra automática, você também pode aumentar o número de colunas usando, por exemplo,
fonte
Além disso, o mesmo problema pode ser causado pelo uso de símbolos unicode largos (como em https://stackoverflow.com/a/34812608/1657819 ). Aqui está o trecho que está causando o problema (lembre-se das seqüências de cores de escape apropriadas
$Green
e$Red
):O Bash não pode calcular o comprimento corretamente, portanto, a maneira mais fácil seria escapar de duas das três partes desses símbolos largos.
fonte
\001
e\002
.