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

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

我在 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\]>'

有关详细信息,请参阅以下资源

bash 提示符:http://mywiki.wooledge.org/BashFAQ/053

输入:https://linuxcommand.org/lc3_adv_tput.php

答案2

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

只需确保你\[PS1引文前面有颜色设置即可

例如:

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

答案3

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

在您的文件中添加以下行.bashrc

COLUMNS=250

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

答案4

我在自定义颜色提示中遇到了同样的问题,尽管我在分隔符内包含了颜色代码\[\]结果bash 在函数内部回显颜色时出现问题。我最终只是使用变量作为我的提示,虽然我的 .bashrc 不太优雅,但现在一切都运行良好。

相关内容