问题是,如果我在 bashrc 中更新 PS1,我会发现默认情况下光标会放在第 0 列而不是提示符之后,如果我输入任何内容,它就会开始覆盖提示符。我手动测试了相同的 PS1 字符串,方法是删除 bashrc 文件,启动新会话并在终端中输入 PS1 字符串,结果一切正常。
我找到了这个问题的答案,但花了我一整天的时间,在谷歌上搜索了很多次后,我还是没有找到确切的答案。基本问题出在 bashrc 文件格式上。在我的情况下,文件是 DOS 格式,行尾有两个字符。解决方法是将文件从 DOS 格式转换为 UNIX 格式,然后它就开始工作了。然而,我不知道文件格式究竟是如何导致这个问题的,即使“PS1='XXX'”是整个文件中唯一的东西,没有任何换行符,它也不会起作用。
以下链接提供有关如何转换文件的信息: http://cs.nyu.edu/~yap/prog/cygwin/FAQs.html#bashrc
答案1
正如您所说,问题在于 DOS 格式。更具体地说:DOS 换行格式。
- DOS 换行符格式是两个字符的字符串:回车符和换行符。
- Unix/Linux 换行符格式只有一个字符:换行符。
换行符通常写为 ,\n
而回车符写为\r
。
当您有带有声明的 DOS 格式的.bashrc
文件PS1
并且 bash 读取该文件时,它将读取以下内容:
PS1='XXX'\r\n
对于 bash 来说,行在 之前结束\n
。因此变量PS1
定义为'XXX'\r
。这是字符串XXX
后跟一个回车符。回车符意味着将回车符(闪烁的光标)返回到行首。Bash 就是这样做的。
阅读更多关于换行符问题的内容维基百科关于换行符的文章。
要快速检查文件是否使用 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
和。查找P
53
S
ASCII 代码对于其他角色来说。
0a
是\n
并且0d0a
是\r\n
。每当您在文件中看到一堆0d0a
s 时,这表明您的文件正在使用 dos 换行符。