「/dev/random」から読み込むと、カーソルの後に「1;2c」文字が置かれるのはなぜですか? [コピー]

「/dev/random」から読み込むと、カーソルの後に「1;2c」文字が置かれるのはなぜですか? [コピー]

コマンドを実行すると、ランダムなゴミバイナリデータが表示されますが、それを受信した後もdd if=/dev/random count=1 bs=32プロセスが終了した後も一部の文字が残っています(いつものように)。1;2cdd

[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ターミナルウィンドウが実際には1つの統合ではなく、ある程度一緒に機能する3つのものであることを示しています。

  • ターミナルエミュレータ(実際のGUIターミナルアプリケーションまたはLinuxテキストコンソールの組み込みターミナルエミュレータ)
  • オペレーティングシステムのTTYまたはPTY(擬似TTY)デバイスドライバ
  • シェルまたは当時のTTY入力を処理するすべてのプログラム。

0x1b 0x63ランダムガベージには、()または()バイトシーケンスのうちの1つだけが含まれます。ESC c0x1b 0x30 0x63ESC0 c

これらのシーケンスは、クラシックVT100端末と互換性のあるすべての端末または端末エミュレータに対して特別な意味を持ちます。これは、端末の基本属性を記述するコードで応答するように端末 (/emulator) に要求します。

ESC[?1:2c端末は、「この端末は高度なビデオオプションを持つVT100です」を意味する文字列で応答しました。 (これはxterm他の多くの互換性のある端末エミュレータが通常送信する応答です。)

文字列はユーザ​​ーが入力したように送信されますが、コマンドにddキーボードは必要ないため、PTYドライバは最初にプロンプ​​トの冒頭^[[?1;2cに示すように文字列を再エコーします。 (制御文字を^[表す一般的な方法です。)ESC

その後、ddコマンドは終了し、シェルはプロンプトを表示し、PTYドライバの入力バッファで待機しているいくつかの入力を見て、それを読み取って解釈しようとします。

  • ESC[bashデフォルトのメタキー入力の1つではなくMeta-[として解釈されるため、何もしません。
  • ?どんな理由からなのか今はわからないのでフィルタリングもされています。 (ご存知であれば、この回答に自由にコメントを付けたり編集してください。)
  • 残りは、前のコマンドが完全に完了する前に入力を開始したコマンドの開始である場合に備えて、プロンプトの後にシェルによって再表示されます。

端末エミュレータに影響を与える可能性がある他の制御シーケンスもあります。 Xtermと互換性のある端末エミュレータが理解する制御シーケンスのリストは次のとおりです。https://www.xfree86.org/current/ctlseqs.html

誤ってランダムなゴミをターミナルウィンドウに入れてターミナル表示が悪くなった場合(たとえば、ランダムデータに「文字セット変更」コードが含まれて文字が認識できなくなる場合)、変換方法を知りたい場合もあります。 。台無しにされた端末ウィンドウが再び正常状態にリセットされる。いくつかの戦略があります:

  • GUIターミナルウィンドウを使用している場合は、「ターミナルリセット」メニューオプションを含めることができます。
  • 「デフォルトの文字セットに戻る」の制御コードは単純なControl+ o(数字以外の文字O)なので、これを入力してEnterキーを押すと、次のプロンプトがより良く見えることがわかります。
  • コマンドプロンプトにあるように見えても文字が認識されない場合は、単なる表示の問題であると仮定し、盲目的にコマンドを入力しresetてEnterキーを押します。
  • フルスクリーンテキストベースのプログラム(=使用されているすべてのプログラム)の場合は、+を押して混乱を防ぐためにディスプレイの完全な更新を要求(n)cursesできます。ControlL

おすすめ記事