当我运行命令时,我得到一些随机垃圾二进制数据,但在收到它们后,进程终止后dd if=/dev/random count=1 bs=32
仍然有一些字符(正如我总是看到的那样)。1;2c
dd
[amirreza@localhost ~]$ dd if=/dev/random count=1 bs=32
¾¿܄ÌYLÔAëEÔr/f&-È<>ýø1+0 records in
1+0 records out
32 bytes copied, 3.5878e-05 s, 892 kB/s
^[[?1;2c[amirreza@localhost ~]$ 1;2c
这个字符是什么以及为什么在 终止后抛出它dd
?
答案1
这种情况揭示了 Linux/Unix GUI 终端窗口实际上并不是一个集成的东西,而是或多或少一起工作的三个东西:
- 终端仿真器(实际的 GUI 终端应用程序,或 Linux 文本控制台的内置终端仿真器)
- 操作系统的 TTY 或 PTY(伪 TTY)设备驱动程序
- shell,或者当时正在处理 TTY 输入的任何程序。
随机垃圾恰好包含以下字节序列之一:( ) 或0x1b 0x63
( ) 。ESC c
0x1b 0x30 0x63
ESC0 c
这些序列对于与经典 VT100 终端兼容的任何终端或终端仿真器具有特殊含义:它请求终端(/仿真器)以描述终端主要属性的代码进行响应。
终端以字符串 进行响应ESC[?1:2c
,该字符串过去表示“该终端是具有高级视频选项的 VT100”。 (这是响应xterm
,许多其他与其兼容的终端仿真器通常会发送响应。)
该字符串的发送方式就像您键入它一样,但该dd
命令不需要任何键盘,因此 PTY 驱动程序最初只是回显它,就像^[[?1;2c
您在提示符开头看到的那样。 (^[
是表示ESC控制字符的常用方法。)
然后dd
命令结束,shell 显示提示符,看到一些输入在 PTY 驱动程序的输入缓冲区中等待,读取它并尝试解释它:
- ESC
[
被解释为 Meta-[ ,这不是bash
的默认元击键之一,因此它不执行任何操作。 ?
由于某种原因,我目前无法弄清楚,它也被过滤掉(如果您知道,请随意评论或编辑此答案)- 其余部分在提示符后由 shell 重新显示,以防万一它是您在上一个命令完全完成之前开始键入的命令的开头。
还有一些其他控制序列也可能影响您的终端仿真器。 Xterm 和兼容终端仿真器可以理解的控制序列列表位于:https://www.xfree86.org/current/ctlseqs.html
如果您不小心将一些随机垃圾放入终端窗口,并且它使终端显示变得更糟(例如,随机数据恰好包含“更改字符集”代码,使字符无法识别),您可能想了解如何将混乱的终端窗口重置回正常状态。有几种策略:
- 如果您使用的是 GUI 终端窗口,它可能包含“重置终端”菜单选项
- “返回默认字符集”的控制代码是一个简单的Control+
o
(字母 O,而不是数字),因此您可以尝试键入该代码并按 Enter 键,看看下一个提示是否看起来更好。 - 如果您看起来像是在命令提示符下,但字符无法识别,您可以假设这只是显示问题,只需盲目键入命令
reset
并按 Enter 键即可。 - 对于任何基于文本的全屏程序(=任何使用 的程序
(n)curses
),您可以按Control+L
请求完全刷新显示,以防出现任何混乱。