дальнейшее чтение

дальнейшее чтение

Когда я использую clearкоманду для очистки экрана. Он не очищается (см. скриншот, когда я немного прокручиваю вверх после выполнения команды)

введите описание изображения здесь

Поэтому я удваиваю команду, чтобы добиться правильного поведения:

$ clear && clear && DD=0 ...

введите описание изображения здесь

Почему мне нужно дважды вводить команду, чтобы очистить экран?

ОБНОВЛЕНИЕ

На самом деле, если бы я просто clearочистил экран. Но я могу прокрутить вверх и увидеть последние 25 строк (если экран 80x25). Когда я запустил, clear;clearэти строки были очищены.

решение1

Важно отметить тег вопроса. Такое поведение характерно для GNOME Terminal и любых других эмуляторов терминала, построенных на libvte. Вы не увидите этого в Xterm, или в Unicode RXVT, или в эмуляторе терминала, встроенном в ядро ​​Linux, или в консоли FreeBSD.

В общем случае происходит следующее.

  1. Команда clearпросматривает terminfo/termcap и выдает соответствующие управляющие последовательности.
    1. Если запись terminfo/termcap имеетE3 возможность, она сначала записывает это. Это выдает управляющие последовательности для очистки буфера прокрутки. Это и история, стоящая за этим, подробно документированы вСтраница руководства Dickey ncurses дляclear команды.
    2. Затем он использует clearвозможность очистки видимого экрана.
  2. Управляющие последовательности в записи terminfo/termcap определяются типом терминала; но, за исключением (ныне редких) терминалов, которые используют FormFeed для очистки экрана (чего не делают DEC VT и их имитаторы), они представляют собой либо просто старые управляющие последовательности ECMA-48, либо их расширения. Например:
    • Theputtyопределяет E3=\E[3J, какая последовательность управления расширением Xterm.
    • Консоль NetBSDpcvtxxВходявляется одним из многих, которые определяют clear=\E[H\E[Jили что-то похожее. Это две обычные последовательности управления ECMA-48.
  3. Эмулятор терминала действует на управляющие последовательности. Как определено ECMA-48 и расширением Xterm к нему:
    • CSI H(CUP) возвращает курсор в исходное положение.
    • CSI 0 J(ED 0) или просто CSI Jстирает от текущей позиции курсора до конца экрана.
    • CSI 2 J(ED 2) стирает весь экран.
    • CSI 3 J(ED 3) очищает буфер прокрутки.

Если говорить конкретно о Терминале GNOME:

  1. Тип терминала указан правильно gnome, но некоторые ошибочно оставляют его установленным на xterm.
  2. ThegnomeЗаписьне определяет E3возможности, и во многих системах — до сих пор! — тоже не определяетxterm поскольку это не просочилось изДики термино. Поэтому clearпросто записывает содержимое возможности clear.
  3. Содержимое возможностей clearэтих записей terminfo представляет собой управляющие последовательности для возврата курсора в исходное положение и последующей очистки всего экрана.
  4. Однако в GNOME Terminal не реализована корректная очистка всего экрана. Точнее, библиотека, на которой он основан, libvte, не делает этого в кодеегоVteTerminalPrivate::seq_clear_screen() функция. Вместо этого libvte прокручивает экран вниз на целый экран пустых строк и перемещает курсор на первую из этих пустых строк.

Вот почему вы видите то, что видите. libvte не стирает весь экран, когда ему говорят это сделать. Скорее, он делает что-то, что имеет поверхностное сходство с этим, пока вы не сделаете то же самое, что сделал здесь спрашивающий: прокрутите окно терминала назад, чтобы посмотреть на буфер прокрутки назад. Тогда разница будет очевидной.

На других эмуляторах терминала, таких как Xterm и Unicode RXVT, последовательность управления ED 2 действительно стирает экран, стирая каждую позицию на экране на месте, сверху вниз, и не изменяя буфер прокрутки. Но на эмуляторах терминала libvte она просто выталкивает текущий экран вверх в буфер прокрутки и добавляет пустые строки на весь экран. Предыдущее содержимое экрана не стирается, а сдвигается в буфер прокрутки.

А если выполнить clearкоманду дважды, она добавитдвапустых строк на экране. Если ваш буфер прокрутки достаточно большой, вы можетевсе ещенайдите исходное содержимое экрана, просто переместившись выше в буфере прокрутки.

дальнейшее чтение

решение2

Если вы хотите очистить терминал и уничтожить весь буфер вывода, я бы рекомендовал сделать tput reset. Это определенно очистит терминал и исправит его состояние в качестве бонуса, если, например, какая-либо предыдущая программа аварийно завершилась и оставила терминал в нечистом состоянии. Кроме того, он tputдолжен быть достаточно умен, чтобы определить правильный тип терминала, поэтому вам не нужно знать, использует ли ваш терминал VT100 или какие-либо другие последовательности команд.

Как tput resetопределено в POSIX, он должен работать в любой совместимой с POSIX системе:https://pubs.opengroup.org/onlinepubs/007904975/utilities/tput.html

Связанный контент