Como obtenho longas linhas de comando para passar para a próxima linha?

90

Algo que eu notei no Ubuntu por um longo tempo que tem sido frustrante para mim é quando eu estou digitando um comando na linha de comando que fica mais longo (maior) que a largura do terminal, em vez de embrulhar para uma nova linha, volta para a coluna 1 na mesma linha e começa a gravar o início da minha linha de comando. (Na verdade, ele não sobrescreve o comando real, mas visualmente está sobrescrevendo o texto que foi exibido).

É difícil explicar sem ver, mas digamos que meu terminal tenha 20 caracteres de largura (o meu é mais parecido com 120 caracteres - mas por exemplo), e eu quero repetir o alfabeto Inglês. O que eu digito é isto:

echo abcdefghijklmnopqrstuvwxyz

Mas o que meu terminal parece antes de apertar a tecla é:

pqrstuvwxyzghijklmno

Quando eu clico em enter, echos

abcdefghijklmnopqrstuvwxyz

então eu sei que o comando foi recebido corretamente. Ele apenas envolveu minha digitação após o "o" e começou na mesma linha.

O que eu esperaria que acontecesse, se eu digitasse este comando em um terminal com apenas 20 caracteres de largura, seria este:

echo abcdefghijklmno
pqrstuvwxyz

Antecedentes: Estou usando o bash como meu shell e tenho esta linha em meu ~ / .bashrc:

set -o vi

para poder navegar na linha de comando com comandos VI. Atualmente, estou usando o servidor Ubuntu 10.10 e conectando-me ao servidor com o Putty.

Em qualquer outro ambiente em que trabalhei, se eu digitar uma longa linha de comando, ele adicionará uma nova linha abaixo da linha em que estou trabalhando quando meu comando ficar maior que a largura do terminal e quando eu continuar digitando eu posso ver meu comando em 2 linhas diferentes. Mas enquanto me lembro de usar o Ubuntu, meus comandos longos ocupam apenas uma linha.

Isso também acontece quando eu estou voltando aos comandos anteriores no histórico (eu apertei Esc, então 'K' para voltar aos comandos anteriores) - quando eu chego a um comando anterior que era maior que a largura do terminal, o a linha de comando fica desconfigurada 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.

Eu não acho que tenha algo estranho no meu arquivo .bashrc. Eu comentei a linha "set -o vi", e ainda tive o problema.

Baixei uma nova cópia do Putty e não fiz nenhuma alteração na configuração - acabei de digitar meu nome de host para me conectar, e ainda tenho o problema, então não acho que seja nada com Putty (a menos que Eu preciso fazer algumas alterações de configuração)

Alguém mais teve esse problema e alguém pode pensar em como corrigi-lo?

Editar

Era meu arquivo .bashrc. Eu copiei o mesmo perfil de máquina para máquina, e usei caracteres especiais no meu $ PS1 que de alguma forma o estão jogando fora. Agora estou seguindo as variáveis bash padrão para meu $ PS1.

Obrigado a @ ændrük pela dica no .bashrc!

... Fim da edição ...

    
por BrianH 01.02.2011 / 21:17

6 respostas

55

Eu acho que você configurou seu PS1 com cores, certo?

Certifique-se de ter \[ dentro da sua cota PS1 que precede seu conjunto de cores

Por exemplo:

PS1='\[\e[0;32m\u@\w/:\[\e[m '
    
por user10070 02.02.2011 / 08:06
118

Certifique-se de que todos os bytes não imprimíveis em seu PS1 estejam contidos em \[ \] . Caso contrário, o bash contará no comprimento do prompt. Ele usa o tamanho do prompt para determinar quando quebrar a linha.

Por exemplo, o bash conta o prompt com 19 colunas de largura, enquanto o prompt exibido pelo terminal tem apenas 10 colunas de largura ( My prompt escrito em ciano e > escrito em cor padrão):

PS1='\e[36mMy prompt\e[0m>'         # bash count: 19, actual: 10

enquanto aqui, ele conta apenas o prompt com 10 colunas de largura, porque ignora os bytes entre as especiais \[ e \] escapes:

PS1='\[\e[36m\]My prompt\[\e[0m\]>' # bash count: 10, actual: 10

Para uma boa prática, use tput para gerar as fugas do terminal em vez de codificá-las:

cyan=$(tput setaf 6) # \e[36m
reset=$(tput sgr0)   # \e[0m
PS1='\[$cyan\]My prompt\[$reset\]>'

Veja o link e também link para mais sobre tput .

    
por geirha 02.02.2011 / 09:00
9

Eu tive um problema semelhante e finalmente encontrei uma solução simples.

Adicione a seguinte linha no seu arquivo .bashrc :

COLUMNS=250

Em seguida, digite source ~/.bashrc para obter o efeito desejado.

    
por Deboshree 17.04.2012 / 12:58
5

Eu tive o mesmo problema com um prompt colorido personalizado, embora eu contivesse códigos de cores nos delimitadores \[ e \] . Acontece que bash tem problemas em ecoar cores de dentro de uma função . Acabei de usar apenas variáveis para o meu prompt, e embora o meu .bashrc seja um pouco menos elegante, tudo funciona bem agora.

    
por reentim 06.05.2012 / 06:20
0

Uma coisa simples a fazer seria adicionar a seguinte linha antes de definir o PS1:

stty columns 1000

Por exemplo,

stty columns 1000
PS1='\[\e[0;32m\u@\w/:[\e[m '

mas isso afeta outros comandos unix como ls e man.

    
por Gennady 12.02.2013 / 16:27
0

Eu tive esse problema quando conectado no tmux. O problema era que eu tinha uma sessão de ipython em segundo plano ( ctrl + z ) e que de alguma forma quebrava quebra de linha. Assim que terminei ( fg , ctrl+d+d ) meu terminal começou a funcionar corretamente

Portanto, verifique se há algum aviso interativo interrompido.

    
por Ciprian Tomoiagă 07.04.2017 / 22:39