60404


# 現象

16進数`1b5b366e` (`^[`[6n)※を標準出力に書き込むと`echo`が終了し、あたかも`;1R`をキー入力したかのような状態となります。  
※`^[`は制御コードESCです。  
簡単に確認できるよう`echo`コマンドを使用していますが、16進数`1b5b366e`が含まれるファイルを`cat`コマンドで標準出力に書き込んでも同じ現象が発生します。

[code]

    $ echo -n -e "\x1b\x5b\x36\x6e"
    $ ;1R
    
[/code]

# 質問

  1. どうしてこのような現象が発生するのか
  2. 16進数`1b5b366e`は何なのか

# 経緯

`script`コマンドを起動し、`vim`を操作ました。結果ファイル`typescript`を`cat`コマンドで標準出力に書き込んだところ、同様の現象が発生しました。  
原因を調べるため、現象が発生しない部分を除いていったところ、この16進数にたどり着きました。

# 環境

Ubuntu-18.04 (WSL)


CC BY-SA 4.0
2019-11-09T10:42:27.590
60371
2019-11-11T06:35:31.277
35558
question
untagged
16進数1b5b366e(※)を標準出力に書き込むと不可解な現象が発生する　※ESCシーケンス6nか？


>   2. 16進数1b5b366eは何なのか
>

既にコメントがついているように、VT100互換のエスケープシーケンスです。  
`ESC [ 6n` => `CSI 6n` で現在のカーソル位置の報告です。  
`CSI y ; x R` の形式らしいですが、`CSI`で始まっているので、同様にエスケープシーケンスになるのでは?


CC BY-SA 4.0
2019-11-09T12:16:13.207
60374
2019-11-09T12:16:13.207
60371
answer


より厳密にいうと「標準出力」ではなくて「コンソール画面」それも [`vt100`
系エスケープシーケンス](https://www.google.com/search?q=vt100%20%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97)に対応している端末に出力した場合ですね。

「 `vt100` 端末」は画面制御にエスケープシーケンスを使っています。 `teraterm` のような端末ソフトも `vt100`
エスケープシーケンスに対応しているくらい今でも一般的によく使われている画面制御手順です。別の例

[code]

    $ echo -n -e "\x1b[2J" > clearscreen.txt
    $ od -tx1 clearscreen.txt
    0000000 1b 5b 32 4a　(標準出力をリダイレクトすると化けないことがわかる)
    0000004
    $ cat clearscreen.txt (画面が消去される）
    $ echo -e "\x1b#8" (画面が E で埋まる)
    
[/code]

`1b5b366e` はアスキー化すると `ESC[6n` です。これは端末情報のレポート機能で `vt100` はこのバイト列を受け取ると、カーソル位置を
`ESC[数値１;数値２R` の形式でバイト列として返してきます。通常は interactive shell
がそのバイト列を受け取るわけですが、シェルから見るとユーザーがキー入力したのか端末が生成したのかは区別ができず、つまりあたかもキー入力があったかのように見えることになります。で、最初の
`ESC` キー入力は `bash` 等が行制御コマンドとして受け取るので画面上出力されず、よって `0;1R`
のようなキー入力が行途中まであったかのように振る舞います。

`vi` や `vim` や `emacs` などスクリーンエディタはコンソール画面操作にこのエスケープシーケンスを使っています（厳密には
`tcsetattr()` 等の端末制御関数が環境変数 `TERM=` に合わせてエスケープシーケンスを出力します）

`script` コマンドは画面を操作しないコマンド向けで `vi`
のようなインタラクティブなコマンドのログを取るときは注意、とあります。実際、この質問においては画面制御コマンドまでログが取れてしまっていて混乱を招いています。あなたの目的に
`script` コマンドが適切かどうかを再検討すべきでしょう。  
<https://linuxjm.osdn.jp/html/util-linux/man1/script.1.html>


CC BY-SA 4.0
2019-11-11T03:27:06.377
60404
2019-11-11T06:35:31.277
2019-11-11T06:35:31.277
8589
8589
60371
answer