正如您所说,问题是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编码而言,它代表一个字符。例如50is P和53is S。查找其他字符的ASCII码。
0a是\n并且0d0a是\r\n。每当您0d0a在文件中看到一堆s时,表明您的文件正在使用dos换行符。