正如您所说,问题是DOS格式。更具体地说:DOS换行格式。
- DOS新行格式是两个字符的字符串:回车符和换行符。
- Unix / Linux换行符格式只是一个字符:换行符。
换行字符通常写为,\n
而回车符通常写为\r
。
当您使用DOS格式的.bashrc
文件PS1
声明且bash读取该文件时,它将读取以下内容:
PS1='XXX'\r\n
对于bash行在之前结束\n
。因此,变量PS1
定义为'XXX'\r
。这是字符串,XXX
后跟回车符。回车意味着将回车(闪烁的光标)返回到行首。Bash正是这样做的。
在Wikipedia上有关newline的文章中阅读更多有关newline的信息。
为了快速检查文件是否使用dos或unix / linux换行符,可以使用以下file
命令:
$ file bashrc
bashrc: ASCII text
$ file bashrc_dosnewlines
bashrc_dosnewlines: ASCII text, with CRLF line terminators
CR
是回车,是换LF
行。
要进行详细检查,请使用六角转储器,例如xxd
:
$ xxd bashrc
0000000: 5053 313d 2758 5858 270a PS1='XXX'.
$ xxd bashrc_dosnewlines
0000000: 5053 313d 2758 5858 270d 0a PS1='XXX'..
简短说明:输出有三列。第一列是文件中的偏移量。第二和第二列是文件的十六进制表示形式。最后一列是文件的可读格式。点用于没有明智的人类可读表示的字符。
每对十六进制数字代表一个字节,就ASCII编码而言,它代表一个字符。例如50
is P
和53
is S
。查找其他字符的ASCII码。
0a
是\n
并且0d0a
是\r\n
。每当您0d0a
在文件中看到一堆s时,表明您的文件正在使用dos换行符。