
Когда я использую clear
команду для очистки экрана. Он не очищается (см. скриншот, когда я немного прокручиваю вверх после выполнения команды)
Поэтому я удваиваю команду, чтобы добиться правильного поведения:
$ clear && clear && DD=0 ...
Почему мне нужно дважды вводить команду, чтобы очистить экран?
ОБНОВЛЕНИЕ
На самом деле, если бы я просто clear
очистил экран. Но я могу прокрутить вверх и увидеть последние 25 строк (если экран 80x25). Когда я запустил, clear;clear
эти строки были очищены.
решение1
Важно отметить тег вопроса. Такое поведение характерно для GNOME Terminal и любых других эмуляторов терминала, построенных на libvte. Вы не увидите этого в Xterm, или в Unicode RXVT, или в эмуляторе терминала, встроенном в ядро Linux, или в консоли FreeBSD.
В общем случае происходит следующее.
- Команда
clear
просматривает terminfo/termcap и выдает соответствующие управляющие последовательности.- Если запись terminfo/termcap имеет
E3
возможность, она сначала записывает это. Это выдает управляющие последовательности для очистки буфера прокрутки. Это и история, стоящая за этим, подробно документированы вСтраница руководства Dickey ncurses дляclear
команды. - Затем он использует
clear
возможность очистки видимого экрана.
- Если запись terminfo/termcap имеет
- Управляющие последовательности в записи terminfo/termcap определяются типом терминала; но, за исключением (ныне редких) терминалов, которые используют FormFeed для очистки экрана (чего не делают DEC VT и их имитаторы), они представляют собой либо просто старые управляющие последовательности ECMA-48, либо их расширения. Например:
- The
putty
определяетE3=\E[3J
, какая последовательность управления расширением Xterm. - Консоль NetBSD
pcvtxx
Входявляется одним из многих, которые определяютclear=\E[H\E[J
или что-то похожее. Это две обычные последовательности управления ECMA-48.
- The
- Эмулятор терминала действует на управляющие последовательности. Как определено ECMA-48 и расширением Xterm к нему:
- CSI
H
(CUP) возвращает курсор в исходное положение. - CSI
0
J
(ED 0) или просто CSIJ
стирает от текущей позиции курсора до конца экрана. - CSI
2
J
(ED 2) стирает весь экран. - CSI
3
J
(ED 3) очищает буфер прокрутки.
- CSI
Если говорить конкретно о Терминале GNOME:
- Тип терминала указан правильно
gnome
, но некоторые ошибочно оставляют его установленным наxterm
. - The
gnome
Записьне определяетE3
возможности, и во многих системах — до сих пор! — тоже не определяетxterm
поскольку это не просочилось изДики термино. Поэтомуclear
просто записывает содержимое возможностиclear
. - Содержимое возможностей
clear
этих записей terminfo представляет собой управляющие последовательности для возврата курсора в исходное положение и последующей очистки всего экрана. - Однако в GNOME Terminal не реализована корректная очистка всего экрана. Точнее, библиотека, на которой он основан, libvte, не делает этого в кодеего
VteTerminalPrivate::seq_clear_screen()
функция. Вместо этого libvte прокручивает экран вниз на целый экран пустых строк и перемещает курсор на первую из этих пустых строк.
Вот почему вы видите то, что видите. libvte не стирает весь экран, когда ему говорят это сделать. Скорее, он делает что-то, что имеет поверхностное сходство с этим, пока вы не сделаете то же самое, что сделал здесь спрашивающий: прокрутите окно терминала назад, чтобы посмотреть на буфер прокрутки назад. Тогда разница будет очевидной.
На других эмуляторах терминала, таких как Xterm и Unicode RXVT, последовательность управления ED 2 действительно стирает экран, стирая каждую позицию на экране на месте, сверху вниз, и не изменяя буфер прокрутки. Но на эмуляторах терминала libvte она просто выталкивает текущий экран вверх в буфер прокрутки и добавляет пустые строки на весь экран. Предыдущее содержимое экрана не стирается, а сдвигается в буфер прокрутки.
А если выполнить clear
команду дважды, она добавитдвапустых строк на экране. Если ваш буфер прокрутки достаточно большой, вы можетевсе ещенайдите исходное содержимое экрана, просто переместившись выше в буфере прокрутки.
дальнейшее чтение
- Функции управления для кодированных наборов символов. ECMA-48. 1976.
- Георгий Кирилов (30.12.2007).Ctrl-L добавляет пустое место в буфер прокрутки.. Ошибка GNOME №506438.
- В какой степени эмуляторы терминалов xterm, xterm-color и linux основаны на VT100?
- Очистка «старого» буфера прокрутки
- Странное поведение команды Bash clear: удаляется буфер прокрутки.
- https://superuser.com/questions/1094599/
- Томас Дики (2018). "Известные ошибки в XTerm и его аналогах: Терминал GNOME". XTerm Часто задаваемые вопросы. невидимый-остров.нет.
- Томас Дики (2018). "Известные ошибки в XTerm и двойниках: заметки о VTE". XTerm Часто задаваемые вопросы. невидимый-остров.нет.
решение2
Если вы хотите очистить терминал и уничтожить весь буфер вывода, я бы рекомендовал сделать tput reset
. Это определенно очистит терминал и исправит его состояние в качестве бонуса, если, например, какая-либо предыдущая программа аварийно завершилась и оставила терминал в нечистом состоянии. Кроме того, он tput
должен быть достаточно умен, чтобы определить правильный тип терминала, поэтому вам не нужно знать, использует ли ваш терминал VT100 или какие-либо другие последовательности команд.
Как tput reset
определено в POSIX, он должен работать в любой совместимой с POSIX системе:https://pubs.opengroup.org/onlinepubs/007904975/utilities/tput.html