为什么“head /bin/ls”会重置终端

为什么“head /bin/ls”会重置终端

如果你做了一些愚蠢的事情,比如cat /var/log/wtmp你的终端可能会变得混乱,如屏幕截图所示。我知道有很多方法解决这个问题。几年前我被告知的那篇文章中没有提到的方法之一是运行屏幕截图中红色框中突出显示的命令。

head /bin/ls

这有效。

为什么?

终端重置屏幕截图

答案1

终端由与要显示的字符数据一起发送的转义序列控制。例如,这就是如何echo -e '\e[34m'将许多终端上的文本变成蓝色的。它向终端回显一些字符——它们恰好是设置前景色的转义序列。

终端被指示切换到一些替代字符集(可能还有更多东西)而搞乱了。它这样做是因为/var/log/wtmp碰巧包含用于切换字符集的转义序列。从技术上讲,它并没有真正混乱——它完全按照设计的方式运行。 (尝试tput smacs根据需要弄乱您的终端;tput rmacs将该参数改回来。)

reset等功能通过发送转义序列将各种参数重置为其默认值。这“修复”了终端。

这个head /bin/ls技巧之所以有效,是因为您的/bin/ls(或至少由 打印的部分head)恰好包含将终端参数更改回来的转义序列。这根本不是可移植的——例如,它在这里不起作用——而且重置默认值的工作可能比reset等要彻底得多。)

答案2

事实上,图中并没有显示任何白描人物。跑步reset(通常)会帮助。而且reset还修复了终端模式,比以下更可靠stty sane

  • 如果您使用stty sane,这将解决回显和回车的终端模式问题,但是Unix将擦除字符设置为您可能不想要的值的平台(即 AIX、HPUX 和 Solaris),例如^?或。#^H
  • reset命令(至少是 ncurses 提供的命令)改进了这些设置,并发送终端初始化字符串。那通常重置备用字符集(但某些终端可能有所不同,因为这也是 Unix 终端描述中有时被忽视的功能)。

如果你显示线条画字符,这些可能是因为有一个移出控制字符(不是转义序列):

SO        Shift Out (Ctrl-N) -> Switch to Alternate Character Set.  This
          invokes the G1 character set.

这是我制作的画线字符的屏幕截图

ls
tput smacs
ls -l

在此输入图像描述

偶尔有人会显示一张包含二进制垃圾和线条画字符混合的图片,但这个问题和另一个提到的(ab)问题都没有使用该功能。相反,他们阐明还有另外两个特点:

  • 并非所有字符都可打印(考虑图片上的大空白区域),并且
  • 一些字节序列不形成合法的 UTF-8,并且由终端仿真器以特殊标记显示,例如Unicode 替换字符

进一步阅读:

相关内容