Недавно я пытался узнать больше о том, как работает оболочка, и смотрел, как 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"
Мне было действительно любопытно, как этот вывод этой команды переводит на очистку консоли.
stty -a
Ответы:
Выходные данные
clear
команды - управляющие коды консоли. Точные требуемые коды зависят от того, какой именно терминал вы используете, однако в большинстве случаев используются последовательности управления ANSI. Вот хорошая ссылка, объясняющая различные коды - http://www.termsys.demon.co.uk/vtansi.htm . Соответствующие фрагменты:А также:
Где
<ESC>
шестнадцатеричный1B
или восьмеричный033
. Еще один способ просмотра символов:источник
Это работает, выпуская определенные escape-последовательности ANSI . В частности, эти два:
Возможно, это легче понять в выводе
od -c
:033
естьEsc
, так что вывод выше простоEsc[H
и потомEsc[2J
.источник
Вывод, передаваемый clear (1), зависит от типа вашего терминала, определенного $ TERM в среде оболочки. Он делает то же самое, что и команда «tput clear», которая ищет код выхода для текущего типа терминала и отправляет эту строку в стандартный вывод.
Терминал, получающий код escape от clear / tput, интерпретирует его и выполняет отправленную команду, например, очищает локальный дисплей. «терминал» означает локальную консоль или сеанс терминала (putty, xterm и т. д.), возможно, через ssh или telnet.
источник
Я удивлен, что другие ответы не упомянули TERMINFO (или TERMCAP)
Используйте справочные страницы Люка
man clear
говорит ...СРОК
Команда
clear
использует escape-последовательности ANSI только в том случае, если$TERM
задано ANSI или какой-либо тип терминала на основе ANSI, например XTERM.INFOCMP
Вы можете использовать
infocmp
для расследованияTPUT
Или вы можете использовать
tput
для просмотра возможностейисточник
В дополнение ко всему хорошему ответу выше, мы можем сделать несколько шагов, чтобы увидеть, что произойдет:
Как видите, две команды предоставляют одно и то же
ANSI escape sequences
.источник
Во-первых, / bin / echo -e "\ x1b \ x5b \ x48 \ x1b \ x5b \ x32 \ x4a \ c" на самом деле не очищает экран. Вы можете прокрутить вверх, чтобы увидеть предыдущее содержимое.
Во-вторых, я открыл IRB (интерактивную оболочку Ruby) и набрал:
Или
p %x(clear)
Или:
Все коды должны вернуться
"\e[3J\e[H\e[2J"
Теперь откройте свой терминал, введите
echo -e "\e[3J\e[H\e[2J"
Это должно очистить экран. Это так называемые escape-последовательности ANSI:
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
) и многое другое!источник