消去コマンドはどのように機能しますか?

消去コマンドはどのように機能しますか?

私は最近、シェルがどのように動作するかをより理解し、clearコマンドがどのように機能するかを調べようとしました。実行可能ファイルは にあり/usr/bin/clear、空行(ターミナルの高さと同じ)を印刷してカーソルを端末の左上に配置するようです。

端末のサイズに関係なく、コマンドの出力は常に同じです。

$ clear | hexdump -C
00000000  1b 5b 48 1b 5b 32 4a                              |.[H.[2J|
00000007

そしてまったく同じ効果でechoを使って複製することができます。

$ /bin/echo -e "\x1b\x5b\x48\x1b\x5b\x32\x4a\c"

このコマンドの出力がどのようにコンソールクリアに変換されるのか本当に疑問に思います。

答え1

このコマンドの出力はclearコンソールエスケープコードです。必要な正確なコードは、使用している特定の端末によって異なりますが、ほとんどはANSI制御シーケンスを使用します。以下は、さまざまなコードを説明するための良いリンクです。http://www.termsys.demon.co.uk/vtansi.htm。関連スニペットは次のとおりです。

Cursor Home         <ESC>[{ROW};{COLUMN}H

Sets the cursor position where subsequent text will begin. If no row/column
parameters are provided (ie. <ESC>[H), the cursor will move to the home position,
at the upper left of the screen.

そして:

Erase Screen        <ESC>[2J

Erases the screen with the background colour and moves the cursor to home.

<ESC>16進数1Bまたは8進数はどこにありますか033?キャラクターを見るもう一つの方法は次のとおりです。

clear | sed -n l

答え2

特定の放出を介して動作します。ANSIエスケープシーケンス。具体的には2つあります。

Esc[Line;ColumnH カーソル位置:
Esc[Line;Columnf] は、カーソルを指定された位置 (座標) に移動します。位置を指定しないと、カーソルは
                                         画面左上の開始位置(0行、0列)に移動します。

Esc[2Jディスプレイを消去:
                                         画面を消去し、カーソルを開始位置
                                         (0行、0列)に移動します。

次の出力を見ると、理解しやすくなりますod -c

$ clear | od -c
0000000 033   [   H 033   [   2   J
0000007

033はいEsc、上記の出力は単にEsc[H合計ですEsc[2J

答え3

Clear(1) から送信される出力は、シェル環境で $TERM で定義された端末タイプによって異なります。これは、現在の端末タイプのエスケープコードを見つけ、その文字列を標準出力に送信する "tputclear"コマンドと同じことを行います。

Clear/tput からエスケープコードを受信した端末は、それを解釈してローカルディスプレイを消去するなど、送信されたコマンドを実行します。 「ターミナル」は、sshまたはtelnetを介したローカルコンソールまたはターミナルセッション(putty、xtermなど)を表します。

答え4

上記のすべての良い答えに加えて、何が起こるかを確認するためにいくつかのストレスを実行することもできます。

$ strace -e trace=write echo -e "\x1b\x5b\x48\x1b\x5b\x32\x4a\c"
write(1, "\33[H\33[2J", 7

$ strace -e trace=write clear
write(1, "\33[H\33[2J", 7

どちらのコマンドも同じですANSI escape sequences

関連情報