Algo que notei no Ubuntu por um longo tempo que foi frustrante para mim é que, quando estou digitando um comando na linha de comando que fica mais longo (mais largo) que a largura do terminal, em vez de agrupar em uma nova linha, ele volta para coluna 1 na mesma linha e começa a sobrescrever o início da minha linha de comando. (Na verdade, não substitui o comando real, mas visualmente, substitui o texto que foi exibido).
É difícil de explicar sem vê-lo, mas digamos que meu terminal tenha 20 caracteres de largura (o meu é mais parecido com 120 caracteres - mas por uma questão de exemplo), e quero repetir o alfabeto inglês. O que eu digito é este:
echo abcdefghijklmnopqrstuvwxyz
Mas a aparência do meu terminal antes de eu pressionar a tecla é:
pqrstuvwxyzghijklmno
Quando eu apertei enter, ele ecoa
abcdefghijklmnopqrstuvwxyz
então eu sei que o comando foi recebido corretamente. Apenas enrolou minha digitação após o "o" e recomeçou na mesma linha.
O que eu esperava que acontecesse, se eu digitasse este comando em um terminal com apenas 20 caracteres de largura, seria o seguinte:
echo abcdefghijklmno
pqrstuvwxyz
Background: Estou usando o bash como meu shell e tenho esta linha no meu ~ / .bashrc:
set -o vi
para poder navegar na linha de comandos com os comandos VI. Atualmente, estou usando o servidor Ubuntu 10.10 e me conectando ao servidor com o Putty.
Em qualquer outro ambiente em que trabalhei, se eu digitar uma linha de comando longa, ela adicionará uma nova linha abaixo da linha na qual estou trabalhando quando meu comando ultrapassa a largura do terminal e, quando eu continuar digitando, posso ver meu comando 2 linhas diferentes. Mas enquanto me lembro de usar o Ubuntu, meus comandos longos ocupam apenas 1 linha.
Isso também acontece quando estou retornando aos comandos anteriores da história (pressione Esc, depois 'K' para retornar aos comandos anteriores) - quando chego a um comando anterior que era maior que a largura do terminal, a linha de comando fica mutilado e não posso dizer onde estou no comando.
A única solução alternativa que encontrei para ver todo o comando longo é pressionar "Esc-V", que abre o comando atual em um editor de VI.
Acho que não tenho nada de estranho no meu arquivo .bashrc. Eu comentei a linha "set -o vi" e ainda tinha o problema.
Fiz o download de uma nova cópia do Putty e não fiz nenhuma alteração na configuração - apenas digitei o nome do host para me conectar e ainda tenho o problema, por isso não acho que haja nada com o Putty (a menos que precise faça algumas alterações na configuração)
Alguém já teve esse problema e alguém pode pensar em como corrigi-lo?
Editar
Era o meu arquivo .bashrc. Copiei o mesmo perfil de máquina para máquina e usei caracteres especiais no meu $ PS1 que, de alguma forma, estão jogando fora. Agora estou aderindo às variáveis padrão do bash para o meu $ PS1.
Obrigado a @ ændrük pela dica sobre o .bashrc!
... Finalizar edição ...
fonte
/etc/skel/.bashrc
. Lembre-se de que você precisará se reconectar para que as alterações tenham efeito e mantenha um backup próprio .bashrc.tput smam
Respostas:
Verifique se todos os bytes não imprimíveis no seu PS1 estão contidos
\[ \]
. Caso contrário, o bash os contará no comprimento do prompt. Ele usa o comprimento do prompt para determinar quando quebrar a linha.Por exemplo, aqui o bash conta o prompt como 19 colunas de largura, enquanto o prompt exibido pelo terminal tem apenas 10 colunas de largura (
My prompt
escritas em ciano e>
escritas na cor padrão):enquanto aqui conta apenas o prompt com 10 colunas de largura porque ignora os bytes entre o especial
\[
e\]
escapa:Porém, para boas práticas, use
tput
para gerar as fugas do terminal em vez de codificá-las:Consulte http://mywiki.wooledge.org/BashFAQ/053 e também http://wiki.bash-hackers.org/scripting/terminalcodes para obter mais informações
tput
.fonte
PS1='...'
: por que as aspas simples não impedem$cyan
e$reset
substituem?$cyan
e$reset
são substituídos, masPS1
são avaliados sempre que o prompt é impresso. Você pode ver isso tentandoPS1='$var> '
e, em seguida, forneçavar
vários valores e veja como o prompt muda. Em seguida, tentePS1="$var> "
perceber que o prompt permanece estático;$var
foi expandido durante a tarefa, nem semprePS1
é avaliado.PS1=${PS1}"\e]2;$@\a"
. Eu tenteiPS1=${PS1}"\[\e]2;\]$@\[\a\]"
Eu acho que você configurou o seu
PS1
com cores, certo?Apenas certifique-se de ter
\[
dentro de suaPS1
cotação anterior ao conjunto de coresPor exemplo:
fonte
export PS1='^[[96m'$(hostname)'<^[[92m${PWD}^[[96m>^[[97m '
- Estive usando que um por um longo tempo - é KSH compatível ...\[
no início e\]
no final.\\[
foi um erro de digitação causado por uma edição. Eu consertei isso.Eu tive um problema semelhante e finalmente encontrei uma solução simples.
Adicione a seguinte linha no seu
.bashrc
arquivo:Em seguida, digite
source ~/.bashrc
para obter o efeito desejado.fonte
source .bashrc
. Seu prompt será atualizado imediatamentesetwinsize
conjunto para o meu bash, por isso não estava atualizando colunas da direita, consulte unix.stackexchange.com/a/167911/8337export COLUMNS=250
seguiexport TERM=xterm
e foi feliz.Eu tive o mesmo problema com um prompt colorido personalizado, apesar de conter códigos de cores
\[
e\]
delimitadores. Acontece que o bash tem problemas em reproduzir cores de dentro de uma função . Acabei usando apenas variáveis para meu prompt e, embora meu .bashrc seja um pouco menos elegante, tudo funciona bem agora.fonte
Uma coisa simples a fazer seria adicionar a seguinte linha antes de configurar o PS1:
Por exemplo,
no entanto, isso afeta outros comandos unix como ls e man.
fonte
Eu tive esse problema quando conectado no tmux. O problema era que eu tive uma
ipython
sessão em segundo plano (ctrl + z
) e que de alguma forma quebrou a quebra de linha. Assim que eu terminei (fg
,ctrl+d+d
) meu terminal começou a funcionar corretamentePortanto, verifique se há avisos interativos interrompidos.
fonte
Então, eu tive o mesmo problema com uma ligeira torção e pensei em compartilhar minha solução também, apenas para adicionar minha pequena nuance: D
Meu PS1 inicial era
O problema que tive foi que estava tentando alterar o título do meu terminal e o prompt de comando. A maneira como fiz isso foi adicionando
\[\033]0;\]Title\a
à variável PS1 .Então agora meu PS1 era:
Isso estragou tudo para mim. Finalmente descobri que o bash não parece gostar de ter
\a
no final. Para contornar isso, coloquei o título em uma variável, que parecia corrigi-lo.fonte
\[
e\]
não funcionou para mim. Eu acho que havia algo diferente sobre como eu estava gerando o prompt (de um programa externo) ou porque meu prompt era "dinâmico".Depois de ler este eu achei que você pode realmente escapar os códigos de cor com o
0x01
e0x02
bytes.por exemplo, estou usando uma versão especial do Chalk e envolvo as cores usando isso:
fonte