终端屏幕乱码怎么解决?(通常在调整大小之后)

non*_*ity 101 bash terminal

有时,终端屏幕会乱七八糟,当我们使用man ls阅读手册页,或按向上箭头转到历史记录中的前一命令时,屏幕会显示不正确的字符。(例如,将屏幕的结尾视为屏幕中间的某个位置)。

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

但是这样一来,我们之前做的任何事情都会丢失,比如启动虚拟机控制台等,那么如果不关闭shell,有没有办法解决这个问题呢?

(这发生在 Fedora 内部,也发生在 Macbookssh到 RHEL 5.4 盒子中)。

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

小智 114

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

shopt | grep checkwinsize
Run Code Online (Sandbox Code Playgroud)

如果你没有得到

checkwinsize    on
Run Code Online (Sandbox Code Playgroud)

然后激活它

shopt -s checkwinsize
Run Code Online (Sandbox Code Playgroud)

Bash 文档说“checkwinsize”属性:

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

如果你喜欢这个设置,你可以checkwinsize在你的~/.bashrc.

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

  • 这并没有解决我的问题,但这是一个很好的一般答案,所以无论如何+1。我认为我的问题与 ssh-ing 到 Linux 服务器时的 Windows 仿真(?)有关。 (7认同)

Blu*_*ber 26

你可以试试Ctrl+ L。它根据程序清除和/或重绘终端屏幕。

  • 但它并不能永久解决问题...... (4认同)

小智 16

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

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

export PROMPT_COMMAND="resize &>/dev/null ; $PROMPT_COMMAND"
Run Code Online (Sandbox Code Playgroud)

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

感谢UKmonkey对 PROMPT_COMMAND 的改进。

  • 我个人会使用`export PROMPT_COMMAND="resize &>/dev/null; $PROMPT_COMMAND"` 这样旧的提示命令,无论我是什么都会被保留 (2认同)
  • 我会在需要时手动运行调整大小。询问控制台的大小可能很慢。执行每个命令似乎过多,通常您知道何时调整了它的大小。 (2认同)

小智 14

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

-e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM
Run Code Online (Sandbox Code Playgroud)

  • 我可以告诉你他不是:“码头工人”与“5年前”并不相符。Docker 尚未在 2013 年 1 月发布;-) (4认同)

non*_*cut 12

我不时在 macOS 上使用 zsh 遇到同样的问题。一个简单的reset命令调用再次按照我的喜好设置终端。

  • OP 提到它不适用于 Linux 风格。我在 MacOS Sierra 上遇到了这个问题,并且在这种情况下“重置”有效。我添加了这个答案来帮助在 MacOS 上遇到同样问题并且不知道“reset”命令的任何人。 (2认同)

sak*_*trp 6

我只是想补充一下 Arcadien 已经提到的内容。checkwinsize 启用可以解决问题,但对我来说,需要的是重置窗口的大小以使其正常工作。我想 checkwinsize 是为了消除这种情况,但仍然值得一试。只需尝试更改窗口的大小或在此选项后取消最大化和最大化它。


phi*_*294 6

尝试stty sane。它应该做你需要的事情。


use*_*107 5

如果你正在使用expect

将其添加到脚本的开头即可工作

#let pty slave device aware of WINCH signal
trap {
 set rows [stty rows]
 set cols [stty columns]
 stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH
Run Code Online (Sandbox Code Playgroud)

更多详细信息和解释请访问 https://unix.stackexchange.com/a/668254/109036