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.