我有一个问题,如果我在bash中输入很长的命令,终端将无法正确显示我输入的内容。我希望如果我有如下命令:

username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com


该命令应该在两行上呈现。取而代之的是,它通常会环绕起来并开始在提示的顶部进行写,如下所示:光标会出现的位置,有时在提示的中间,但通常在我键入的位置的上方。

当我执行上一个命令时,还会带来更多的乐趣。有人认为这是我的提示,所以在这里是:发生同样的事情。

我检查了一下,并在bash中启用了reset。这发生在80x24和其他尺寸的窗口上。

这是我学会与之共处的东西吗?我应该知道一些魔术吗?我已经同意只使用一个很短的提示,但这不能解决问题。

评论

因此,使用命令env -i bash --norc可以对其进行修复。 $ COLUMNS和$ LINES匹配。这是否意味着我的.bashrc有一些有趣的地方?

因此,我注释掉了.bashrc,最后将提示隔离为有问题的部分,尤其是涉及的着色语法。上面的PS1有什么问题?

\ [\ 033 [01; 32m \] \ u:\ [\ 033 [01; 34m \] \ W \ [\ 033 [01; 34m \] \ $ \ [\ 033 [0m \]]似乎避免了怪异的行为-但不知道它是否完全尊重您的原始提示...

按照关于serverfault的此答案,使用tput smam

#1 楼

不可打印的序列应包含在\[\]中。查看您的PS1,它在\W之后具有未封闭的序列。但是,第二个条目是多余的,并且重复了前面的语句“ 1; 34”。
\[3[01;32m\]\u:\[3[01;34m\] \W3[01;34m $\[3[00m\]
                  |_____________|               |_|
                         |                       |
                         +--- Let this apply to this as well.

因此,这应该具有预期的颜色:原始”,这也应该起作用:
\[3[1;32m\]\u:\[3[1;34m\] \W $\[3[0m\]
                               |_____|
                                  |
                                  +---- Bold blue.


编辑:
行为的原因是因为bash认为提示的时间要长于实际时间。举一个简单的例子,如果使用:
\[3[1;32m\]\u:\[3[1;34m\] \W\[3[1;34m\] $\[3[0m\]
                                  |_|         |_|
                                   |           |
                                   +-----------+-- Enclose in \[ \]

提示被认为是8个字符而不是1。因此,如果终端窗口是20列,则在键入12个字符后被认为是20并环绕。如果再尝试执行退格键或Ctrl + u,这也很明显。它停在第9列。 32个字符。

评论


如果您(或任何人)对原始顺序中的确切原因导致该行在其自身上重复进行了解释,那么我很想知道。此外,您还可以+1以直观的方式展示它。

–user44370
2013年12月20日在2:42



@illuminÉ:尚未查看源代码,但添加了更新,并记录了观察到的行为。

– Runium
2013年12月20日下午3:26

万一您遇到任何问题,可以使用此网站创建一个新网站-bashrcgenerator.com

–divinedragon
2015年12月11日下午6:12

太神奇了,谢谢@Runium-您介意分享您的知识吗?我很乐意找到有关此的一些文档。

–nynynik
17-3-27在19:57



@nycynik:观察。我猜最接近文档的是源代码...

– Runium
17年3月30日在21:17

#2 楼

这主要与终端假定的窗口大小与您的实际窗口大小不同有关。如果您使用的是bash,则可以尝试一下。 >然后使用

$ shopt checkwinsize


激活它,然后只需尝试运行另一个命令(如ls)或调整窗口大小一次,以上每次对我都有效。

特别是对于Redhat系统,此问题通常是由于错误配置~/.bashrc而不调用/etc/bashrc引起的。通常,bash会加载~/.bashrc,它应该调用/etc/bashrc,默认情况下包含shopt -s checkwinsize

评论


在OS X上也有同样的问题,显然,如果您调用“登录”来启动终端,它将以读取/ etc / bashrc的方式启动bash,但是如果直接调用bash,则〜/ .bashrc不会默认情况下提供源内容,因此您会得到奇怪的包装效果。谢谢!

–rogerdpack
2015年9月11日在22:16

这也为我工作。颜色未在此特定服务器上显示,调用了正确的/ etc / bashrc,其他所有操作都很好...事实证明这是包装问题的原因。

– dhaupin
15年11月20日在20:23

另请参见unix.stackexchange.com/a/61608/2221

–astrojuanlu
16年5月4日在10:17

看起来是一个很好的解决方案。但是,它在我的ssh会话中不起作用。不知道为什么。我已经在ssh会话中运行了shopt -s checkwinsize命令。但是包裹仍然存在。

–徐强
18年7月20日在19:15

这恰好是我的问题-用户.bashrc并未调用/ etc / bashrc,因此一团糟。

–Sobrique
19年8月15日在9:14

#3 楼

我曾经读过某处(不知道在哪里),使用\[21\]代替q4312079q和q4312079q可以解决此问题。

顺便说一句,定义PS1看起来并不难看。

green="q4312078q1$(tput setaf 2)q4312078q2"
blue="q4312078q1$(tput setaf 4)q4312078q2"
dim="q4312078q1$(tput dim)q4312078q2"
reset="q4312078q1$(tput sgr0)q4312078q2"

PS1="$dim[\t] " # [hh:mm:ss]
PS1+="$green\u@\h" # user@host
PS1+="$blue\w$$reset " # workingdir$

export PS1
unset green blue dim reset


评论


我的PS1调用了一个命令,该命令将printf转义序列引起OP的问题。只有此解决方案可以为我解决此问题。

– RickMeasham
18年6月4日在6:47

#4 楼

如其他答案中所述,诸如\e[0;30m之类的不可打印序列应使用\[...\]包裹。

(另外,我尚未看到)似乎\r\n应该在\[...\]之外如果有多行提示。我花了一些反复试验才能最终弄清楚。

#5 楼

这听起来像您的COLUMNSLINES环境变量设置有问题。调整窗口大小时,它们通常是由gnome-terminal自动设置的(我相信),您可以通过发出命令resize来强制它们进行手动设置。如果我将gnome终端的大小调整为79x17,则变量将显示如下:

$ echo $COLUMNS; echo $LINES
79
17


我可以这样强制:

$ resize
COLUMNS=79;
LINES=17;
export COLUMNS LINES;


评论


有趣,但无济于事。

– ur
2013年12月19日在22:57

这解决了我运行命令“ screen”后无法正确换行的问题。谢谢!!

–nukeguy
17年5月30日在20:21

命令调整大小来自哪个软件包?

–耕种
20 Mar 8 '20在12:22

@till-认为它是X11的一部分-kb.iu.edu/d/abwh

–slm♦
20 Mar 9 '20在15:40

#6 楼

为了防止换行,您还可以使用例如

stty columns 120

增加列数

评论


这不是一个好主意,它残酷地破坏了vim

– phil294
18-09-23在4:53

#7 楼

同样,使用宽的unicode符号(例如来自https://stackoverflow.com/a/34812608/1657819)也可能导致相同的问题。颜色字符串):

FancyX='247'
Checkmark='243'


# Add a bright white exit status for the last command
PS1="$White$? "
# If it was successful, print a green check mark. Otherwise, print
# a red X.
if [[ $Last_Command == 0 ]]; then
    PS1+="$Green$Checkmark "
else
    PS1+="$Red$FancyX "
fi


Bash无法正确计算长度,因此最简单的方法可能是从宽符号的三部分中逸出2。 br />
FancyX='\[24\]7'
Checkmark='\[24\]3'


评论


说得通。我猜是bash会计算字符。因为X取一个字符但写为3,所以一个需要将其中2个括起来以固定计数。 @blauhirn答案还解释了如何在具有\ 001和\ 002的函数中执行操作。

–akostadinov
19年1月24日在22:59

仅供参考,这是您找出如何以这种格式输出多字节unicode字符的方法:stackoverflow.com/a/602924/520567

–akostadinov
19年1月25日在7:36

#8 楼

tput smam

在具有TERM=xterm-256color的Gnome终端的Ubuntu 19.10上,它发出的确切转义序列使终端换行: >您可以看到逃脱的原因:

tput smam


用以下方式重置终端状态:

tput smam | hd


似乎也具有设置tput smam的效果。
reset


但是请注意,某些终端不具备此功能,例如在smam内部,我们有rmam,而tmux未出现在功能列表中:我不确定如何,但是QEMU能够更改tmux的换行状态,而TERM=screen-265color却没有。

评论


在tmux和screen下,setterm --linewrap = off仍然有效。可能在未咨询termcap / terminfo的情况下硬编码为\ 033 [?7l和\ 033 [?7h]?

–贝尼(Beni Cherniavsky)-帕斯金(Paskin)
20-10-21在21:22

@ BeniCherniavsky-Paskin感谢您提供此信息。下次它开始伤害我时,我将尝试一下! :-)必须(重新)学习转义码列表的记录位置。

– Ciro Santilli郝海东冠状病六四事件法轮功
20-10-21在21:28



@ BeniCherniavsky-Paskin OK,Esc [?7l是根据hd发出的,根据ascii-table.com/ansi-escape-sequences-vt-100.php它的名称为DECAWM。

– Ciro Santilli郝海东冠状病六四事件法轮功
20-10-21在21:32