ক্লিয়ার কমান্ড কীভাবে কাজ করে?


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কমান্ডের আউটপুট হ'ল কনসোল এসকেপ কোডগুলি। প্রয়োজনীয় কোডগুলি আপনি যে টার্মিনালটি ব্যবহার করছেন তার উপর নির্ভর করে তবে বেশিরভাগ এএনএসআই নিয়ন্ত্রণ ক্রম ব্যবহার করে। বিভিন্ন কোডের ব্যাখ্যা দেওয়ার জন্য এখানে একটি ভাল লিঙ্ক - 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>হেক্স 1Bবা অষ্টাল কোথায় 033। চরিত্রগুলি দেখার আরও একটি উপায় হ'ল:

clear | sed -n l

18

এটি নির্দিষ্ট এএনএসআই এস্কেপ সিকোয়েন্স জারি করে কাজ করে । বিশেষতঃ এই দুটি:

এসএসসি [লাইন; কলামHH কার্সার অবস্থান:
Esc [লাইন; কলামফ কর্সারকে নির্দিষ্ট অবস্থানে নিয়ে যায় (স্থানাঙ্ক)। আপনি যদি
                                         কোনও অবস্থান নির্দিষ্ট না করেন তবে কার্সারটি
                                         স্ক্রিনের উপরের-বাম কোণে (লাইন 0, কলাম 0) হোম অবস্থানে চলে যায় moves

এসএসসি [2 জে ইরেজ প্রদর্শন:
                                         স্ক্রিনটি সাফ করে এবং কার্সারটিকে বাড়ির অবস্থানে নিয়ে যায়
                                         (লাইন 0, কলাম 0)।

এর আউটপুটটিতে এটি সম্ভবত বোঝা সহজ od -c:

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

033হয় Esc, সুতরাং উপরের আউটপুট সহজ Esc[Hএবং তারপর হয় Esc[2J


9

ক্লিয়ার (1) দ্বারা প্রেরিত আউটপুটটি আপনার টার্মিনালের ধরণের উপর নির্ভর করে, শেল পরিবেশে $ TERM দ্বারা সংজ্ঞায়িত। এটি "tput Clear" কমান্ডের মতো একই কাজ করে যা বর্তমান টার্মিনাল প্রকারের জন্য এস্কেপ কোড সন্ধান করছে এবং স্ট্রিংটিকে স্ট্যান্ডার্ড আউটপুটে প্রেরণ করছে।

টার্মিনালটি সাফ / টুট থেকে পালানোর কোডটি এটি ব্যাখ্যা করে এবং প্রেরিত আদেশটি যেমন স্থানীয় প্রদর্শন সাফ করার জন্য কার্যকর করে। "টার্মিনাল" অর্থ স্থানীয় কনসোল বা একটি টার্মিনাল সেশন (পুটি, এক্সটার্ম, ইত্যাদি), সম্ভবত এসএসএস বা টেলনেটের মাধ্যমে।


7

আমি অবাক হয়েছি অন্য উত্তরগুলি 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কমান্ড শুধুমাত্র ব্যবহার ANSI অব্যাহতি সিকোয়েন্স আপনার যদি $TERMANSI বা কিছু ANSI ভিত্তিক টার্মিনাল 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

আপনি 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

আপনি দেখতে পাচ্ছেন, দুটি কমান্ড একই সরবরাহ করে ANSI escape sequences


0

প্রথমত / বিন / প্রতিধ্বনি -e "\ x1b \ x5b \ x48 \ x1b \ x5b \ x32 \ x4a। C" সত্যিই পর্দা সাফ করে না। পূর্ববর্তী সামগ্রীগুলি দেখতে আপনি উপরে স্ক্রোল করতে পারেন।

দ্বিতীয়ত, আমি আইআরবি (যা একটি ইন্টারেক্টিভ রুবি শেল) খুললাম, এবং টাইপ করেছি:

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"

এটি পর্দা সাফ করা উচিত। এগুলিকে এএনএসআই অব্যাহতি সিকোয়েন্স বলা হয়:

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.