SE 上有很多问题显示如何从被 破坏的终端中恢复cat /dev/urandom
。对于那些不熟悉这个问题的人 - 这里是关于什么的:
- 您执行
cat /dev/urandom
或等效操作(例如,cat binary_file.dat
)。 - 打印垃圾。
那没问题...除非你的终端继续打印垃圾后命令已完成!这是错误渲染的文本的屏幕截图,实际上是 g++ 输出:
我想人们对 C++ 错误有时过于神秘的看法是正确的!
通常的解决方案是运行stty sane && reset
,尽管每次发生这种情况时都运行它有点烦人。
因此,我想重点讨论的是最初的原因为什么会发生这种情况,以及如何防止端子损坏发出此类命令后。我不是在寻找诸如将有问题的命令通过管道传输到tr
or 之类的解决方案xxd
,因为这要求您在实际运行/打印之前知道程序/文件输出二进制文件,并且每次碰巧输出此类数据时都需要记住。
我注意到 URxvt、PuTTY 和 Linux 帧缓冲区中存在相同的行为,因此我认为这不是特定于终端的问题。我的主要怀疑是随机输出包含一些 ANSI 转义代码,这些代码会翻转字符编码(事实上,如果您cat /dev/urandom
再次运行,很可能会打破终端,这似乎证实了这一理论)。如果这是正确的,这个转义码是什么?有没有标准的方法来禁用它?
答案1
不:
- 没有标准方法来“禁用它”,并且
- 破损的细节实际上是终端特定的,但是
- 有一些常见的功能可能会导致您出现不当行为。
对于常用的功能,请查看 VT100 样式的备用字符集,该字符集由^N
和^O
(启用/禁用)激活。当使用 UTF-8 模式时,在某些终端中这可能会被抑制,但是相同的终端有足够的机会用它们的转义序列破坏你的屏幕(这里指的是 GNU 屏幕、Linux 控制台、PuTTY)。做认出。
例如,其他一些转义序列依赖于终端对主机的查询(转义序列)的响应。如果主机没有预料到,结果就是屏幕上出现垃圾。
在其他情况下(例如在 Linux 控制台具有硬编码转义序列的网络设备中),其他终端将认为这是错误编码的,并且似乎冻结了。
所以...您可以只专注于一个终端,删除任何看起来令人讨厌的内容(例如,有些人建议删除在编辑器中使用鼠标定位的功能),并且您可能会得到没有明显漏洞的东西。但这只是一个终端。
答案2
如果你处于控制之中并且知道某个命令会搞砸你,我通常会以 less 之类的方式查看输出。
head -n4 /dev/urandom | less
这通常似乎捕获垃圾并用理智的表示方式打印它,我记得之后从未遇到过任何麻烦用 q 退出,我大胆地指出,以防你不熟悉“减少戒烟”。
答案3
将命令的输出等通过管道传输到 tee 中 -