Por que esse valor PS1 causa um comportamento inesperado? [duplicado]

11

Configurei minha variável PS1 em .bashrc como a seguinte:

PS1='\e[35m[\W]:\e[0m '

Ele conseguiu o que foi planejado (alterar a cor do prompt que exibe cwd dentro de [] e antes de : ), mas quando eu pesquiso no meu histórico de comandos, às vezes partes de comandos tornar-se ligado ao prompt. Por exemplo:

[~]: echo "something"
something
[~]: date
Sun Nov 18 17:07:54 PST 2012
[~]: sudo apt-get install vim
...

Agora, digamos que eu queira retornar ao meu comando echo "something" , pressiono para cima e obtenho

[~]: sudo apt-get install vim

Eu pressiono novamente e isso acontece

[~]: sudo apt-date

novamente

[~]: sudo apt-echo "something"

e se eu deletar tudo na linha de comando pressionando backspace, ele será apagado todo o caminho de volta para

[~]: sudo apt-

Não tem efeito no comando. Por exemplo, a linha [~]: sudo apt-date ainda imprimirá a saída de date etc. Por que isso está acontecendo e como posso obter o prompt desejado sem os efeitos colaterais?

    
por stariz77 19.11.2012 / 04:47

1 resposta

23

O que está acontecendo é que o Bash está ficando confuso sobre o número de caracteres de impressão no seu prompt. Ele envia seqüências de posicionamento do cursor para o terminal para posicionar o cursor corretamente para fazer o histórico de comandos e tal. Ele precisa ter uma boa idéia de onde o cursor está, na verdade, após a impressão do prompt.

Tente definir seu prompt para isso:

PS1='\[\e[35m\][\W]:\[\e[0m\] '

Agora deve funcionar como esperado.

Os pares \[ e \] informam ao Bash que o material entre eles é uma seqüência de escape não imprimível e não move o cursor para frente. Em seguida, ele adivinhará corretamente a posição do cursor e fará uma substituição adequada ao passar pelo histórico de comandos.

Essas informações podem ser encontradas no nó de informações (bash)Printing a Prompt .

Editar: Em versões mais recentes do bash isso mudou para (bash)Controlling the Prompt .

    
por 19.11.2012 / 05:05