Net komut nasıl çalışır?


33

Geçenlerde kabuğun nasıl çalıştığı ve emrin nasıl çalıştığı hakkında daha fazla şey öğrenmeye clearçalışıyordum. Yürütülebilir dosya /usr/bin/cleariçeri yerleştirilir ve bir miktar boş satır basar (terminalin yüksekliğine eşit) ve imleci terminalin sol üst köşesine yerleştirir.

Komutun çıkışı, terminalin boyutundan bağımsız olarak daima aynıdır:

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

ve aynı etkiye sahip yankı ile çoğaltılabilir:

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

Bu komutun çıktısının konsolu nasıl temizlediğine gerçekten değiniyordum.


CTRL + L - bakstty -a
mikeserv

Yanıtlar:


26

clearKomutun çıktısı konsol kaçış kodlarıdır. Gereken tam kodlar kullandığınız tam terminale bağlıdır, ancak çoğu ANSI kontrol dizisini kullanır. Http://www.termsys.demon.co.uk/vtansi.htm - Çeşitli kodları açıklayan iyi bir link . İlgili snippet'ler:

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.

Ve:

Erase Screen        <ESC>[2J

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

<ESC>Hex 1Bveya octal nerede 033. Karakterleri görmenin başka bir yolu şudur:

clear | sed -n l

18

Bazı ANSI kaçış dizileri yayınlayarak çalışır . Özellikle, bu ikisi:

Esc [Satır; SütunH İmleç Konumu:
Esc [Satır; Sütunf İmleci belirtilen konuma taşır (koordinatlar). Eğer yoksa
                                         bir pozisyon, sol üst evde pozisyonuna imleç hareket belirtmek
                                         ekranın köşesinde (satır 0, sütun 0).

Esc [2J Erase Display: Ekranı
                                         temizler ve imleci başlangıç ​​konumuna getirir
                                         (satır 0, sütun 0).

Bu belki de çıktısında anlamak daha kolaydır od -c:

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

033olduğu Escyukarıdaki çıkış sadece bu yüzden, Esc[Hve daha sonra Esc[2J.


9

Clear (1) tarafından gönderilen çıktı, kabuk ortamında $ TERM ile tanımlanan terminal türünüze bağlıdır. Geçerli terminal tipi için kaçış kodunu arayan ve bu dizeyi standart çıktıya gönderen "tput clear" komutuyla aynı şeyi yapar.

Escape kodunu clear / tput'tan alan terminal, onu yorumlar ve yerel ekranı temizleme gibi gönderilen komutu çalıştırır. "terminal", muhtemelen ssh veya telnet aracılığıyla yerel konsol veya terminal oturumu (macun, xterm, vb.) anlamına gelir.


7

Diğer cevapların TERMINFO’dan (veya TERMCAP’tan) bahsetmediğinden şaşırdım.

Man sayfalarını kullan Luke

man clear diyor ...

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.

SÜRE

clearKomut sadece senin eğer ANSI kaçış dizileri kullanan $TERMANSI veya XTERM gibi bazı ANSI tabanlı terminal tipi ayarlanır.

$ 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

infocmpAraştırmak için kullanabilirsiniz

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

tput

Veya tputbir yeteneği görüntülemek için kullanabilirsiniz

$ 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

Yukarıdaki tüm güzel cevaplara ek olarak, ne olduğunu görmek için bazı şeyler yapabiliriz:

$ 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

Görüyorsunuz, iki komut aynı sağlar ANSI escape sequences.


0

Öncelikle / bin / echo -e "\ x1b \ x5b \ x48 \ x1b \ x5b \ x32 \ x4a \ c" ekranı gerçekten temizlemiyor. Önceki içerikleri görmek için yukarı kaydırma yapabilirsiniz.

İkincisi, IRB'yi (etkileşimli bir Ruby kabuğu olan) açtım ve şunu yazdım:

p `clear`

Veya

p %x(clear)

Veya:

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

Tüm kodlar geri dönmeli "\e[3J\e[H\e[2J"

Şimdi terminalini aç, yaz echo -e "\e[3J\e[H\e[2J"

Ekranı temizlemesi gerekir. Bunlara ANSI kaçış dizileri denir:

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

Bu kodları bir metni ( \e[5m) yanıp sönmek, bir metni renklendirmek için kullanabilirsiniz: ( for i in {0..255} ; do printf "\e[38;5;${i}m${i} " ; done ; echo) ve diğer birçok şey!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.