Dd

為什麼從 /dev/random 讀取會將 1;2c 字元放在游標後面?

  • February 28, 2021

當我執行命令時,我得到一些隨機的垃圾二進制數據,但在收到它們後,在程序終止後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

這是揭示 Linux/Unix GUI 終端視窗實際上不是一個集成的東西的情況之一,而是三個或多或少一起工作的東西:

  • 終端模擬器(實際的 GUI 終端應用程序,或 Linux 文本控制台的內置終端模擬器)
  • 作業系統的 TTY 或 PTY(偽 TTY)設備驅動程序
  • shell 或任何當時正在處理 TTY 輸入的程序。

隨機垃圾恰好包含以下字節序列之一:0x1b 0x63(= ESC c) 或0x1b 0x30 0x63( ESC``0 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請求完全刷新顯示,以防萬一出現任何問題。

引用自:https://unix.stackexchange.com/questions/636832