问题描述
在Ubuntu上我注意到了很长时间,这让我感到沮丧的是,当我在比终端宽度更长(更宽)的命令行键入命令时,而不是换行到新行,它会回到第1列在同一行,并启动over-writing我的命令行的开始。 (它实际上并没有覆盖实际的命令,但在视觉上,它覆盖了显示的文本)。
没有看到它就很难解释,但假设我的终端有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’返回到先前的命令)时,也会发生这种情况 – 当我得到一个比终端宽度更长的先前命令时,命令行会变形并且我无法知道我在命令中的位置。
我发现只有work-around才能看到整个长命令,就是打开”Esc-V”,它在VI编辑器中打开当前命令。
我不认为我的.bashrc文件中有什么奇怪的东西。我评论了“set -o vi”这一行,但我仍然遇到了这个问题。
我下载了一个新的Putty拷贝,并没有对配置做任何修改 – 我只是输入了我的主机名来连接,我仍然有问题,所以我不认为它与Putty有什么关系(除非我需要进行一些配置更改)
有没有其他人有这个问题,谁能想到如何解决它?
编辑
这是我的.bashrc文件。我已经将相同的配置文件从机器复制到机器,并且在我的$ PS1中使用了特殊字符,这些字符以某种方式抛弃了它。我现在坚持用我的$ PS1的标准bash变量。
感谢@ændrük的.bashrc提示!
…结束编辑…
最佳解决办法
我想你已经配置了颜色的PS1
,对吧?
只要确保您的\[
在您的颜色集之前的PS1
引用内
例如:
PS1='\[\e[0;32m\u@\w/:\[\e[m '
次佳解决办法
确保PS1中的所有non-printable字节都包含在\[ \]
中。否则,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\]>'
有关tput
的更多信息,请参阅http://mywiki.wooledge.org/BashFAQ/053和http://wiki.bash-hackers.org/scripting/terminalcodes。
第三种解决办法
我有类似的问题,最后找到了一个简单的解决方案。
在.bashrc
文件中添加以下行:
COLUMNS=250
然后键入source ~/.bashrc
以获得所需的效果。
第四种办法
即使我在\[
和\]
分隔符中包含颜色代码,我也遇到了与自定义颜色提示相同的问题。事实证明,bash has problems echoing colours from inside a function。我结束了对我的提示使用变量,虽然我的.bashrc稍微不太优雅,但现在一切正常。