如何解决终端屏幕混乱的问题?(通常在调整大小之后)


75

有时,终端屏幕会混乱,当我们man ls用来阅读联机帮助页或按UP箭头查看历史记录中的先前命令时,屏幕将显示字符位置不正确。(例如,将屏幕的末端视为屏幕中间的某个位置)。

该命令reset已尝试,无法正常工作。一种有效的方法是注销或关闭窗口,然后先调整窗口的大小,然后再执行ssh(或关闭该选项卡,然后调整窗口的大小,然后打开新的选项卡以获取新的外壳)。

但是这样一来,我们将失去以前所做的任何事情,例如启动虚拟机控制台等。因此,如果不关闭外壳,是否有办法解决此问题?

(这是在Fedora内部发生的,也发生在Macbook ssh放入RHEL 5.4机器中)。

更新:我现在记得在Fedora中是如何发生的:我打开了一个终端,并做了一个FreeVM以使用虚拟机(一个外壳)的控制台。我认为它的尺寸为80 x 25,然后过一会儿,我将终端的大小调整为大约130 x 50,然后(VM的“内壳”开始表现得很奇怪)。


您正在使用哪种终端仿真器?如果reset无法解决问题,声音会中断。
jordanm

Fedora中的任何终端程序...以及Mac OS X Lion上的默认终端程序。
nopole

请参阅上面的更新,了解Fedora的工作情况
诺波莱(Nopole)2013年

3
神奇的咒语是^Jreset^J,这里^J意味着紧迫ctrl-J。或者(在图形终端上)您可以尝试该Reset按钮。另外,某些程序只是不准备为改变其下面的终端大小而准备(是的,古老的软件还活着而且在踢),或者只是在终端变得太小时表现不佳。
vonbrand

1
我的问题源于bash错误地计算了提示的长度,因为其中包含颜色代码。我错过了转义字符\ [和\] -看unix.stackexchange.com/questions/105958/...
qneill

Answers:


93

如果您正在使用bash,请使用以下命令检查会话中是否已激活“ checkwinsize”选项

shopt | grep checkwinsize

如果你不明白

checkwinsize    on

然后用

shopt -s checkwinsize

Bash文档说“ checkwinsize”属性:

“如果设置,Bash将在每个命令之后检查窗口大小,并在必要时更新LINES和COLUMNS的值。”

如果您喜欢该设置,则可以checkwinsize在中激活~/.bashrc

  • 激活: shopt -s checkwinsize
  • 停用: shopt -u checkwinsize

6
这并不能解决我的问题,但这是一个很好的一般答案,因此无论如何+1。我认为我的问题与SSH放入Linux服务器时的Windows仿真(?)有关。
2015年

最初,当我使用向上箭头查看历史记录时,它似乎不起作用,但是在执行完第一个命令后,它便修复了所有问题。在我的情况下使用终止符。感谢+1
kstenger '16

这对我有用,但是只能通过关闭 checkwinsize来实现。由于某些原因,即使我的窗口(包含一个picocom会话)高得多,在每个命令之后都设置了LINES = 24。
迈克尔(Michael)

19

您可以尝试Ctrl+ L。根据程序,它会清除和/或重画终端屏幕。


3
但这并不能永久解决问题……
nopole

我想我的意思是,如果您按CTRL L,则此行暂时可以,但是如果再次编辑该行(或在键入的下一个命令行中),则问题仍然存在
nopole

11

将这些选项添加到docker exec似乎解决了我的问题

-e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM

1
您是5年前问这个问题的人吗?
Archemar

3
我可以告诉你他不是:“ docker”与“ 5年前”并不完全匹配。Docker尚未于2013年1月发布;-)
jplandrain,

8

我遇到了同样的问题,上述方法都不对我有用,因为我相信我的bash永远不会收到SIGWINCH被其父进程捕获的信号。

我终于找到了解决方案。我添加到我的.bashrc

export PROMPT_COMMAND="resize &>/dev/null ; $PROMPT_COMMAND"

现在,每次收到新提示时,窗口都会重新调整。

感谢UKmonkey对PROMPT_COMMAND的改进。


2
我个人export PROMPT_COMMAND="resize &>/dev/null; $PROMPT_COMMAND"
会这样做

我只是在需要时手动运行调整大小。向控制台询问大小可能会很慢。执行每个命令似乎都很繁琐,而且通常您会知道何时调整了大小。
康拉德·迈尔

6

我只想添加Arcadien刚才提到的内容。checkwinsize启用确实可以解决问题,但是对我来说,需要重置窗口的大小才能使其正常工作。我猜checkwinsize旨在消除这种情况,但仍然值得一试。只需尝试更改窗口的大小或在此选项后取消最大化和最大化窗口即可。


1
信不信由你,这就是我的固定工作所要做的全部。有趣,因为我先尝试了其他所有内容。
taranaki

4

我不时在macOS上使用zsh遇到相同的问题。一个简单的reset命令调用将终端重新设置为我喜欢的状态。


所以OP提到,reset不为他们工作,这是事实上的问题点....
斯蒂芬·劳赫

OP曾提到它无法在Linux上运行。我在MacOS Sierra上遇到了问题,并reset在这种情况下工作。我添加了此答案以帮助在MacOS上遇到相同问题并且不了解reset命令的任何人。
nonocut

reset可以在Windows Putty和Ubuntu 16.04上使用!
musbach '17

重设工作于Ubuntu 16.04 zsh
A.Wan

2

我遇到了与您相同的问题,这就是我所做的事情:我的用户中
有一个.profile设置,所以我在这里进行所有更改。

有一个叫包xterm其可通过apt-get我不知道做yum。但是由于没有安装权限,因此我从源代码进行了本地安装。链接:http//invisible-island.net/xterm/#download

./configure --prefix=/the/path/you/want/to/install/to
make
make install

我将路径导出到个人资料中,并在同一位置调用了该路径

export PATH=$PATH:/the/path/you/want/to/install/to
resize

因此,现在每次登录时,都会通过调整大小来相应地设置终端大小。


0

好吧,这是一个普遍的问题,应该有一个简单的解决方案。

如果Ctrl + A Ctrl + L等其他措施无效,请尝试使用stty

  1. Ctrl + T:使用本地外壳打开一个新选项卡。
    或:退出屏幕(Ctrl + AD断开连接)并退出SSH会话。
  2. stty -a | grep rows:获取行数和列数。
    例:speed 38400 baud; rows 33; columns 133; line = 0;
  3. 返回您的远程标签或登录并重新连接屏幕。该stty输出应该是不同的。
    例:speed 38400 baud; rows 47; columns 177; line = 0;
  4. 输入stty rows Nstty columns N其中N是“实”数(在屏幕外部)。例:$ stty rows 33; stty columns 133

如果使用Terminator,则可以跳过前三个步骤,因为它在顶部显示了列数和行数。

您无需调整终端窗口的大小即可运行此功能。管理员通常从不同的计算机登录,并且当连接的监视器的大小(分辨率)不同时,最大化的窗口在每台计算机上的大小都会不同。实际上,很难经常遇到这种情况。

结果不仅是某些手册页没有正确显示。使用寻呼机的几乎所有东西-例如,前几行经常会丢失。而且,甚至不要考虑在未对齐的终端中使用VIM。您想突出显示第3行(V)以便替换它,但是当您这样做时,突出显示的文本就是另一行的文本。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.