如何让长命令行换行到下一行?

我在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上的提示!

…结束编辑…

确保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\]>' 

有关tput更多信息,请参阅http://mywiki.wooledge.org/BashFAQ/053 ,以及http://wiki.bash-hackers.org/scripting/terminalcodes 。

我猜你已经为PS1配置了颜色,对吗?

只要确保你有\[在你的颜色集之前的PS1引号内

例如:

 PS1='\[\e[0;32m\u@\w/:\[\e[m ' 

我遇到了类似的问题,最后找到了一个简单的解决方案。

.bashrc文件中添加以下行:

 COLUMNS=250 

然后键入source ~/.bashrc以获得所需的效果。

即使我在\[\]分隔符中包含颜色代码,我也会遇到与自定义颜色提示相同的问题。 事实certificate, bash在函数内部回显颜色时出现问题 。 我最后只是为我的提示使用变量,虽然我的.bashrc稍微不那么优雅,但现在一切都很好。

一个简单的事情是在设置PS1之前添加以下行:

 stty columns 1000 

例如,

 stty columns 1000 PS1='\[\e[0;32m\u@\w/:[\e[m ' 

但这会影响其他unix命令,如ls和man。

在tmux中连接时出现此问题。 问题是我在后台进行了一次ipython会话( ctrl + z )并且以某种方式破坏了换行。 一旦我终止它( fgctrl+d+d )我的终端开始正常工作

因此,请检查所有已停止的交互式提示。