私は最近、シェルがどのように機能するかについてさらに詳しく調べようとしていて、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"
このコマンドのこの出力がコンソールのクリアにどのように変換されるのか、私は本当に興味を持っていました。
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
特定の 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
になります。
Clear(1)が送信する出力は、シェル環境の$ TERMで定義されている端末タイプによって異なります。これは、コマンド「tput clear」と同じことを行います。これは、現在の端末タイプのエスケープコードを検索し、その文字列を標準出力に送信します。
Clear/tputからエスケープコードを受け取った端末はそれを解釈し、ローカルディスプレイのクリアなど、送信されたコマンドを実行します。 「ターミナル」は、ローカルコンソールまたはターミナルセッション(PuTTY、xtermなど)を意味し、おそらくsshまたはtelnetを介します。
他の回答がTERMINFO(またはTERMCAP)について言及していないことに驚いています
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
コマンドは、$TERM
は、ANSIまたは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 -L -1 hpterm | grep clear_screen
clear_screen=\E&a0y0C\EJ,
または、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
上記のすべての素晴らしい答えに加えて、何が起こるかを確認するためにいくつかのトレースを行うことができます:
$ 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
。
まず、/ bin/echo -e "\ x1b\x5b\x48\x1b\x5b\x32\x4a\c"は実際には画面をクリアしません。上にスクロールすると、前のコンテンツを表示できます。
次に、IRB(これはインタラクティブRuby Shell)です)を開き、次のように入力しました。
_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
_)および他の多くのこと!