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


2

问题是,如果我在bashrc中更新PS1,我会发现默认情况下光标将位于列0而不是提示符后,并且如果我键入任何内容,它将开始覆盖提示符。我通过删除bashrc文件,启动新会话并在终端中输入PS1字符串来手动测试了相同的PS1字符串,它工作得很好。

我找到了这个问题的答案,但花了我整整一整天,经过大量的搜索,我没有找到确切的答案。基本问题是bashrc文件格式。在我的情况下,文件是DOS格式,行尾两个字符。解决方法是将文件从DOS转换为UNIX格式,此后开始工作。但是我不知道文件格式到底是怎么引起的,即使整个文件中只有“ PS1 ='XXX'”,并且没有任何新行,它也无法正常工作。

以下链接提供了有关如何转换文件的信息:http : //cs.nyu.edu/~yap/prog/cygwin/FAQs.html#bashrc

Answers:


0

正如您所说,问题是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 P53is S。查找其他字符的ASCII码

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.