如何让长命令行换行到下一行?
我在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
)并且以某种方式破坏了换行。 一旦我终止它( fg
, ctrl+d+d
)我的终端开始正常工作
因此,请检查所有已停止的交互式提示。