username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com
该命令应该在两行上呈现。取而代之的是,它通常会环绕起来并开始在提示的顶部进行写,如下所示:光标会出现的位置,有时在提示的中间,但通常在我键入的位置的上方。
当我执行上一个命令时,还会带来更多的乐趣。有人认为这是我的提示,所以在这里是:发生同样的事情。
我检查了一下,并在bash中启用了
reset
。这发生在80x24和其他尺寸的窗口上。这是我学会与之共处的东西吗?我应该知道一些魔术吗?我已经同意只使用一个很短的提示,但这不能解决问题。
#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 楼
我曾经读过某处(不知道在哪里),使用\[
2
1
和\]
代替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 楼
这听起来像您的COLUMNS
和LINES
环境变量设置有问题。调整窗口大小时,它们通常是由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
评论
因此,使用命令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