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


33

私は最近、シェルがどのように機能するかについてもっと知りたいと思っていて、clearコマンドがどのように機能するかを見ていました。実行可能ファイルが配置さ/usr/bin/clearれ、多数の空白行(端末の高さに等しい)を出力し、端末の左上にカーソルを置きます。

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

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

まったく同じ効果を持つエコーで複製できます。

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

このコマンドの出力がコンソールのクリアにどのように変換されるのか、本当に興味がありました。


CTRL + L -見stty -a
mikeserv

回答:


26

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

18

特定の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


9

clear(1)によって送信される出力は、シェル環境で$ TERMによって定義される端末タイプに依存します。現在の端末タイプのエスケープコードを検索し、その文字列を標準出力に送信するコマンド「tput clear」と同じことを行います。

clear / tputからエスケープコードを受信した端末はそれを解釈し、送信されたコマンド(ローカルディスプレイのクリアなど)を実行します。「ターミナル」は、ローカルコンソールまたはターミナルセッション(putty、xtermなど)を意味し、おそらくsshまたはtelnetを介します。


7

他の回答がTERMINFO(またはTERMCAP)に言及していないことに驚いています

ルークのmanページを使用する

man clear 言う...

NAME
       clear - clear the terminal screen

SYNOPSIS
       clear

DESCRIPTION
       clear clears your screen if this is possible.  It looks in the environ-
       ment for the terminal type and then in the terminfo database to  figure
       out how to clear the screen.

期間

clearコマンドは、あなたがいる場合ANSIエスケープシーケンスを使用して$TERMANSIまたはXTERMなどのいくつかのANSIベースの端末タイプに設定されています。

$ TERM=ansi clear | hexdump -C
00000000  1b 5b 48 1b 5b 4a                                 |.[H.[J|
00000006

$ TERM=wy50 clear | hexdump -C
00000000  1b 2b                                             |.+|
00000002

$ TERM=hurd clear | hexdump -C
00000000  1b 63                                             |.c|
00000002

$ TERM=glasstty clear | hexdump -C
00000000  0c                                                |.|
00000001

$ TERM=vt52 clear | hexdump -C
00000000  1b 48 1b 4a                                       |.H.J|
00000004

$ TERM=hpterm clear | hexdump -C
00000000  1b 26 61 30 79 30 43 1b  4a                       |.&a0y0C.J|
00000009

INFOCMP

infocmp調査に使用できます

$ infocmp -L -1 hpterm | grep clear_screen
        clear_screen=\E&a0y0C\EJ,

TPUT

またはtput、機能を表示するために使用できます

$ tput -T hpterm clear | hexdump -C
00000000  1b 26 61 30 79 30 43 1b  4a                       |.&a0y0C.J|
00000009


$ tput -T hpterm reset | hexdump -C
00000000  20 20 20 20 20 20 20 20  1b 31 20 20 20 20 20 20  |        .1      |
00000010  20 20 1b 31 20 20 20 20  20 20 20 20 1b 31 20 20  |  .1        .1  |
00000020  20 20 20 20 20 20 1b 31  20 20 20 20 20 20 20 20  |      .1        |
00000030  1b 31 20 20 20 20 20 20  20 20 1b 31 20 20 20 20  |.1        .1    |
00000040  20 20 20 20 1b 31 20 20  20 20 20 20 20 20 1b 31  |    .1        .1|
00000050  20 20 20 20 20 20 20 20  1b 31 20 20 20 20 20 20  |        .1      |
00000060  20 20 1b 31                                       |  .1|
00000064

6

上記のすべての良い答えに加えて、何が起こるかを見るためにいくつかの追跡を行うことができます:

$ 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

ご覧のとおり、2つのコマンドが同じを提供しANSI escape sequencesます。


0

まず、/ bin / echo -e "\ x1b \ x5b \ x48 \ x1b \ x5b \ x32 \ x4a \ c"は実際には画面をクリアしません。前の内容を表示するには、上にスクロールできます。

次に、IRB(対話型Rubyシェル)を開き、次のように入力しました。

p `clear`

または

p %x(clear)

または:

require 'open3'
p Open3.capture2('clear')[0]

すべてのコードが返されます "\e[3J\e[H\e[2J"

ターミナルを開いて、次を入力します echo -e "\e[3J\e[H\e[2J"

画面がクリアされます。これらはANSIエスケープシーケンスと呼ばれます。

https://en.wikipedia.org/wiki/ANSI_escape_code

これらのコードを使用して、テキストを点滅(\e[5m)したり、テキストを色付けしたりできます:(for i in {0..255} ; do printf "\e[38;5;${i}m${i} " ; done ; echo)およびその他多くのこと!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.