我在 Ubuntu 中注意到一件让我很沮丧的事情,那就是当我在命令行中输入一个比终端宽度更长(更宽)的命令时,它不是换行,而是回到同一行的第 1 列并开始覆盖命令行的开头。(它实际上并没有覆盖实际的命令,但从视觉上看,它覆盖了显示的文本)。
如果不亲眼看到的话,很难解释,但假设我的终端宽度为 20 个字符(我的终端宽度更像是 120 个字符 - 但为了举例),我想回显英文字母。我输入的内容如下:
echo abcdefghijklmnopqrstuvwxyz
但是在我按下按键之前我的终端是这样的:
pqrstuvwxyzghijklmno
当我按下回车键时,它回显
abcdefghijklmnopqrstuvwxyz
所以我知道命令已正确接收。它只是将我的输入换到“o”后面,然后在同一行重新开始。
如果我在只有 20 个字符宽的终端上输入此命令,我期望发生的情况是:
echo abcdefghijklmno
pqrstuvwxyz
背景:我使用 bash 作为我的 shell,并且我的 ~/.bashrc 中有此行:
set -o vi
能够使用 VI 命令浏览命令行。我目前正在使用 Ubuntu 10.10 服务器,并使用 Putty 连接到服务器。
在我工作过的任何其他环境中,如果我输入一个长命令行,当我的命令长于终端宽度时,它会在我正在处理的行下方添加一个新行,并且当我继续输入时,我可以在 2 行不同的行上看到我的命令。但只要我记得使用 Ubuntu,我的长命令只占用 1 行。
当我返回历史记录中的前一个命令时也会发生这种情况(我按 Esc,然后按“K”返回前一个命令) - 当我到达长度超过终端宽度的前一个命令时,命令行会变得混乱,我无法分辨我在命令中的位置。
我发现查看整个长命令的唯一解决方法是按“Esc-V”,它会在 VI 编辑器中打开当前命令。
我认为我的 .bashrc 文件中没有任何异常。我注释掉了“set -o vi”行,但问题仍然存在。
我下载了最新的 Putty 副本,并且没有对配置进行任何更改 - 我只是输入了我的主机名进行连接,但问题仍然存在,因此我认为这与 Putty 无关(除非我需要进行一些配置更改)
还有其他人遇到过这个问题吗?有人能想到如何解决它吗?
编辑
这是我的 .bashrc 文件。我已将相同的配置文件从一台机器复制到另一台机器,并且我在 $PS1 中使用了特殊字符,这不知何故导致它出错。我现在坚持使用 $PS1 的标准 bash 变量。
感谢@ændrük 提供有关 .bashrc 的提示!
...结束编辑...
答案1
确保 PS1 中的所有不可打印字节都包含在内\[ \]
。否则,bash 会将它们计入提示符的长度中。它使用提示符的长度来确定何时换行。
例如,这里 bash 将提示符算作 19 列宽,而终端显示的提示符只有 10 列宽(My prompt
用青色书写,并>
以默认颜色书写):
PS1='\e[36mMy prompt\e[0m>' # bash count: 19, actual: 10
而这里它只将提示计为 10 列宽,因为它忽略了特殊字符\[
和\]
转义字符之间的字节:
PS1='\[\e[36m\]My prompt\[\e[0m\]>' # bash count: 10, actual: 10
不过,为了获得良好的实践,请使用tput
生成终端转义符而不是对其进行硬编码:
cyan=$(tput setaf 6) # \e[36m
reset=$(tput sgr0) # \e[0m
PS1='\[$cyan\]My prompt\[$reset\]>'
有关详细信息,请参阅以下资源
答案2
我猜你已经配置好PS1
了颜色,对吗?
只需确保你\[
的PS1
引文前面有颜色设置即可
例如:
PS1='\[\e[0;32m\u@\w/:\[\e[m '
答案3
我遇到了类似的问题,最后找到了一个简单的解决方案。
在您的文件中添加以下行.bashrc
:
COLUMNS=250
然后输入source ~/.bashrc
以获得所需的效果。
答案4
我在自定义颜色提示中遇到了同样的问题,尽管我在分隔符内包含了颜色代码\[
。\]
结果bash 在函数内部回显颜色时出现问题。我最终只是使用变量作为我的提示,虽然我的 .bashrc 不太优雅,但现在一切都运行良好。