Bagaimana cara kerja perintah yang jelas?


33

Baru-baru ini saya mencoba mempelajari lebih lanjut tentang cara kerja shell dan melihat bagaimana clearperintah itu bekerja. The executable terletak di /usr/bin/cleardan tampaknya untuk mencetak sekelompok garis kosong (sama dengan ketinggian terminal) dan meletakkan kursor di kiri atas terminal.

Output dari perintah selalu sama, terlepas dari ukuran terminal:

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

dan dapat direplikasi dengan gema yang memiliki efek yang sama persis:

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

Saya benar-benar ingin tahu bagaimana hasil terjemahan dari perintah ini diterjemahkan untuk membersihkan konsol.


CTRL + L - lihatstty -a
mikeserv

Jawaban:


26

Output dari clearperintah ini adalah kode escape console. Kode persis yang diperlukan tergantung pada terminal persis yang Anda gunakan, namun sebagian besar menggunakan urutan kontrol ANSI. Berikut ini adalah tautan yang bagus menjelaskan berbagai kode - http://www.termsys.demon.co.uk/vtansi.htm . Cuplikan yang relevan adalah:

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.

Dan:

Erase Screen        <ESC>[2J

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

Di mana <ESC>hex 1Batau oktal 033. Cara lain untuk melihat karakter adalah dengan:

clear | sed -n l

18

Ini bekerja dengan mengeluarkan urutan pelarian ANSI tertentu . Secara khusus, kedua:

Esc [Line; ColumnH Posisi Kursor:
Esc [Line; Columnf Memindahkan kursor ke posisi yang ditentukan (koordinat). Jika Anda tidak
                                         menentukan suatu posisi, kursor bergerak ke posisi awal di
                                         sudut kiri atas layar (baris 0, kolom 0).

Esc [2J Erase Display:
                                         Menghapus layar dan memindahkan kursor ke posisi home
                                         (baris 0, kolom 0).

Ini mungkin lebih mudah dipahami dalam output dari od -c:

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

033adalah Esc, jadi output di atas sederhana Esc[Hdan kemudian Esc[2J.


9

Output yang dikirim oleh clear (1) tergantung pada tipe terminal Anda, ditentukan oleh $ TERM di lingkungan shell. Itu melakukan hal yang sama dengan perintah "tput clear", yang mencari kode escape untuk tipe terminal saat ini dan mengirimkan string itu ke output standar.

Terminal yang menerima kode pelarian dari clear / tput menafsirkannya dan mengeksekusi perintah yang dikirim, seperti membersihkan tampilan lokal. "terminal" berarti konsol lokal atau sesi terminal (dempul, xterm, dll.), mungkin melalui ssh atau telnet.


7

Saya terkejut jawaban lain belum menyebutkan TERMINFO (atau TERMCAP)

Gunakan halaman manual Luke

man clear kata ...

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.

ISTILAH

The clearperintah hanya menggunakan ANSI escape sequence jika Anda $TERMdiatur untuk ANSI atau beberapa jenis terminal berbasis ANSI seperti xterm.

$ 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

Anda dapat menggunakannya infocmpuntuk menyelidiki

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

TPUT

Atau Anda dapat menggunakan tputuntuk melihat kemampuan

$ 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

Selain semua jawaban yang bagus di atas, kita dapat melakukan beberapa langkah untuk melihat apa yang terjadi:

$ 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

Anda bisa lihat, dua perintah memberikan hal yang sama ANSI escape sequences.


0

Pertama / bin / echo -e "\ x1b \ x5b \ x48 \ x1b \ x5b \ x32 \ x4a \ c" tidak benar-benar menghapus layar. Anda dapat menggulir ke atas untuk melihat konten sebelumnya.

Kedua, saya membuka IRB (yang merupakan shell Ruby interaktif), dan mengetik:

p `clear`

Atau

p %x(clear)

Atau:

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

Semua kode harus dikembalikan "\e[3J\e[H\e[2J"

Sekarang buka terminal Anda, ketik echo -e "\e[3J\e[H\e[2J"

Seharusnya menghapus layar. Ini disebut urutan pelarian ANSI:

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

Anda dapat menggunakan kode-kode ini untuk berkedip teks ( \e[5m), mewarnai teks: ( for i in {0..255} ; do printf "\e[38;5;${i}m${i} " ; done ; echo) dan banyak hal lainnya!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.