Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I was recently trying to learn more about how the shell works and was looking at how the clear command works. The executable is located in /usr/bin/clear and it seems to print out a bunch of blank lines (equal to the height of the terminal) and puts the cursor at the top-left of the terminal.

The output of the command is always the same, regardless of the size of the terminal:

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

and can be replicated with the echo having the exact same effect:

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

I was really curious how this output of this command translates to clearing the console.

share|improve this question
    
CTRL+L - look at stty -a –  mikeserv yesterday
add comment

4 Answers

up vote 14 down vote accepted

The output of the clear command is console escape codes. The exact codes required depend on the exact terminal you are using, however most use ANSI control sequences. Here is a good link explaining the various codes - http://www.termsys.demon.co.uk/vtansi.htm. The relevant snippets are:

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.

And:

Erase Screen        <ESC>[2J

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

Where <ESC> is hex 1B or octal 033. Another way to view the characters is with:

clear | sed -n l
share|improve this answer
add comment

It works by issuing certain ANSI escape sequences. Specifically, these two:

Esc[Line;ColumnH          Cursor Position:
Esc[Line;Columnf            Moves the cursor to the specified position (coordinates). If you do not
                                         specify a position, the cursor moves to the home position at the upper-left
                                         corner of the screen (line 0, column 0).

Esc[2J                              Erase Display:
                                         Clears the screen and moves the cursor to the home position
                                         (line 0, column 0).

This is perhaps easier to understand in the output of od -c:

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

033 is Esc, so the output above is simply Esc[H and then Esc[2J.

share|improve this answer
add comment

The output sent by clear(1) depends on your terminal type, defined by $TERM in the shell environment. It does the same thing as the command "tput clear", which is looking up the escape code for the current terminal type and sending that string to standard output.

The terminal receiving the escape code from clear/tput interprets it and executes the command sent, such as clearing the local display. "terminal" means the local console or a terminal session (putty, xterm, etc.), possibly via ssh or telnet.

share|improve this answer
add comment

In addition to all nice answer above, we can do some strace to see what happen:

$ 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

You can see, two command provide the same ANSI escape sequences.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.