Baru-baru ini saya mencoba mempelajari lebih lanjut tentang cara kerja shell dan melihat bagaimana clear
perintah itu bekerja. The executable terletak di /usr/bin/clear
dan 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.
stty -a
Jawaban:
Output dari
clear
perintah 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:Dan:
Di mana
<ESC>
hex1B
atau oktal033
. Cara lain untuk melihat karakter adalah dengan:sumber
Ini bekerja dengan mengeluarkan urutan pelarian ANSI tertentu . Secara khusus, kedua:
Ini mungkin lebih mudah dipahami dalam output dari
od -c
:033
adalahEsc
, jadi output di atas sederhanaEsc[H
dan kemudianEsc[2J
.sumber
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.
sumber
Saya terkejut jawaban lain belum menyebutkan TERMINFO (atau TERMCAP)
Gunakan halaman manual Luke
man clear
kata ...ISTILAH
The
clear
perintah hanya menggunakan ANSI escape sequence jika Anda$TERM
diatur untuk ANSI atau beberapa jenis terminal berbasis ANSI seperti xterm.INFOCMP
Anda dapat menggunakannya
infocmp
untuk menyelidikiTPUT
Atau Anda dapat menggunakan
tput
untuk melihat kemampuansumber
Selain semua jawaban yang bagus di atas, kita dapat melakukan beberapa langkah untuk melihat apa yang terjadi:
Anda bisa lihat, dua perintah memberikan hal yang sama
ANSI escape sequences
.sumber
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:
Atau
p %x(clear)
Atau:
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!sumber