Depois de atualizar o bashrc no cygwin, o cursor inicia na coluna 0 em vez de depois do prompt

2

O problema é que, se eu atualizar o PS1 no bashrc, vejo que, por padrão, o cursor é colocado na coluna 0 em vez de depois do prompt, e se eu digitar algo, ele começa a sobrescrever o prompt. Eu testei a mesma string PS1 manualmente, excluindo o arquivo bashrc, iniciando uma nova sessão e digitando a string PS1 no terminal e funcionou muito bem.

Encontrei a resposta para este problema, mas demorei um dia inteiro e não encontrei a resposta exata depois de pesquisar muito. O problema básico era com o formato de arquivo bashrc. No meu caso, o arquivo estava no formato DOS com os dois caracteres final de linha. A correção foi converter o arquivo do DOS para o formato UNIX e ele começou a funcionar depois disso. No entanto, não sei exatamente como o formato de arquivo causou o problema, ele não funcionaria mesmo que "PS1 = 'XXX'" fosse a única coisa no arquivo inteiro, sem nenhuma nova linha.

O seguinte link fornece informações sobre como converter o arquivo: link

    
por Rev 30.09.2013 / 07:51

1 resposta

0

O problema é, como você disse, o formato DOS. Mais especificamente: o formato de nova linha do DOS.

  • O formato de nova linha do DOS é uma sequência de dois caracteres: o caractere de retorno de carro seguido pelo caractere de alimentação de linha.
  • O formato de nova linha do Unix / Linux é apenas um caractere: o caractere de alimentação de linha.

O caractere de feed de linha é geralmente escrito como \n enquanto o caractere de retorno de carro é gravado como \r .

Quando você tiver o arquivo formatado .bashrc do DOS com uma declaração PS1 e o bash ler o arquivo, ele lerá o seguinte:

PS1='XXX'\r\n

Para bash A linha termina antes de \n . Portanto, a variável PS1 é definida como 'XXX'\r . Essa é a string XXX seguida por um retorno de carro. Retorno do carro significa retornar o carro (o cursor piscante) ao início da linha. Bash faz exatamente isso.

Leia mais sobre a problemática da nova linha em o artigo da wikipedia sobre a nova linha .

Para uma verificação rápida se um arquivo usa as novas linhas dos ou unix / linux, você pode usar o comando file :

$ file bashrc
bashrc: ASCII text
$ file bashrc_dosnewlines 
bashrc_dosnewlines: ASCII text, with CRLF line terminators

CR é retorno de carro e LF é alimentação de linha.

Para uma verificação detalhada, use um dumper hexadecimal, por exemplo xxd :

$ xxd bashrc
0000000: 5053 313d 2758 5858 270a                 PS1='XXX'.
$ xxd bashrc_dosnewlines 
0000000: 5053 313d 2758 5858 270d 0a              PS1='XXX'..

Uma breve explicação: a saída tem três colunas. A primeira coluna é o deslocamento no arquivo. A segunda coluna e a seguinte são a representação hexadecimal do arquivo. A última coluna é a representação legível do arquivo. Os pontos são usados para caracteres que não têm representação legível humana sensível.

Cada par de dígitos hexadecimais representa um byte, que no caso da codificação ASCII significa um caractere. Por exemplo, 50 é P e 53 é S . Procure os códigos ASCII para os outros personagens.

0a é \n e 0d0a é \r\n . Sempre que você vir um monte de 0d0a s no seu arquivo, isso é um sinal de que seu arquivo está usando as novas linhas.

    
por 30.09.2013 / 08:50