在 cygwin 中更新 bashrc 后,光标从第 0 列开始,而不是在提示符后

在 cygwin 中更新 bashrc 后,光标从第 0 列开始,而不是在提示符后

问题是,如果我在 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和。查找P53SASCII 代码对于其他角色来说。

0a\n并且0d0a\r\n。每当您在文件中看到一堆0d0as 时,这表明您的文件正在使用 dos 换行符。

相关内容