持续破坏 bash 终端的正确方法是什么?

持续破坏 bash 终端的正确方法是什么?

我使用的是 OSX 10.11.1,有时我的 bash 终端会被破坏。当我不小心cat使用二进制文件时,经常会发生这种情况。结果如下图所示。输出变得很奇怪,我无法再输入 ascii 字符。

在此输入图像描述

尽管这种情况偶尔会发生,但我找不到一致重现该问题的方法。在线搜索建议这样做cat /bin/*,但只有在尝试了几十次后才偶尔有效。

我想这样做,这样我就可以找到一个简单的解决方案来处理这个问题tmux

我如何始终使 bash 处于“损坏”状态?是否有一个神奇的 unicode 字符可以做到这一点?

答案1

这看起来像DEC特殊图形字符集

正在阅读xterm 控制序列文档,听起来终端在接收时使用了那些ESC ( 0

所以你应该能够使用

printf '\033(0'

或者

printf '\033(0' > corrupt-my-terminal
cat corrupt-my-terminal

并返回使用

printf '\033(B'

根据同一页面选择 USASCII。


恢复状态的其他方法包括

tput sgr0  # resets all terminal attributes to their defaults

reset      # reinitializes the terminal

您可以tput sgr0在您的PROMPT_COMMAND(bash) 或precmd(zsh) 中确保它始终自动重置。


或者您可以确保使用lessvim或除cat查看文件之外的任何其他选项。

要使less行为类似cat并在文件长度不足一页时自动退出,请运行less -FX或 do export LESS=-FX

或者,如果您不想总是使用这些less选项,请创建一个新别名,例如

alias c='less -FX'

答案2

VT100 仿真器中图形字符集被意外选择的最常见方法是接收字符Control-N,也称为移出。如果您捕获一个二进制文件,并且其中有一个字节的值为“\14”,则可能会导致终端仿真器转换为图形字符集。它在接收到Control-O字符、移入(或通过重置终端的控制序列)时被撤消。它独立于 bash 或可能在终端仿真器中运行的任何其他 shell。

对于在终端仿真器内运行的终端仿真器,语义可能有点复杂。例如,这是如何屏幕处理它:

当调用 screen 的终端的 termcap 条目中存在布尔“G0”功能时,screen 的终端仿真支持多种字符集。这允许应用程序使用 VT100 图形字符集或国家字符集等。支持 ISO 2022 中的以下控制功能:“锁定移位 G0”(“SI”)、“锁定移位 G1”(“SO”)、“锁定移位 G2”、“锁定移位 G3”、“单移位 G2”、和“单班G3”。创建或重置虚拟终端时,ASCII 字符集指定为“G0”到“G3”。当“G0”能力存在时,屏幕评估能力“S0”、“E0”和“C0”(如果存在)。 “S0”是终端用来启用和启动图形字符集的序列,而不是“SI”。 “E0”是“SO”的相应替代。 'C0' 给出在半图形模式期间使用的逐字符翻译字符串。

答案3

在类似的情况下,使用 Bitvise SSH 客户端既不能将终端恢复到正常显示,reset也不能帮我恢复正常显示。tput sgr0

经过一番研究后,我将有问题的字符定位为0x0E( SHIFT OUT):

我能够通过盲目回显0x0FSHIFT IN)来解决它:

echo -e '\x0f'

相关内容