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

Joh*_*ley 4 terminal binary

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

head /bin/ls
Run Code Online (Sandbox Code Playgroud)

这有效。

为什么?

终端重置截图

der*_*ert 7

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

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

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

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

  • @BruceEdiger `stty sane` 不能修复 `tput smacs`...但无论如何,如何修复它是[其他问题](https://unix.stackexchange.com/questions/79684/fix-terminal-after -displaying-a-binary-file) OP 链接到的。如果您想建议可移植的方法来修复它,我建议将它们作为答案发布在那里(当然,如果还没有的话)。 (3认同)