Подтвердить что ты не робот

Использование "альтернативного экрана" в bash script

Альтернативный экран используется многими "пользовательскими" терминальными приложениями, такими как vim, htop, screen, alsamixer, less,... Это похоже на другой буфер содержимого терминала, который исчезает при выходе приложения, поэтому весь терминал восстанавливается, и похоже, что приложение ничего не выводит.

Я хотел бы получить то же самое в своей оболочке (bash) script, за исключением того, что она не должна быть такой переносимой. Я бы придерживался только linux и эмуляторов терминалов на основе xterm; но решение должно использовать что-то вроде tput, если это возможно. Тем не менее, я не хочу использовать какой-то внешний язык сценариев (или даже что-то вроде C).

Хотя я не хочу использовать C (как это должно быть bash - script с максимально возможной зависимостью), я искал исходный код меньше. Похоже, что terminfo используется в качестве базы данных и ищет возможности терминала "ti" при его инициализации. При удалении строки он не использует альтернативный сеанс, поэтому я предположил, что нашел ответственную строку кода.

Однако я не могу найти такую ​​возможность в man terminfo. Но, возможно, я ошибаюсь, найдя решение для этого. Возможно, terminfo/tput не мой друг.

Итак (как) я могу использовать альтернативный экран в bash script? Кто-нибудь знает простое приложение, в котором исходный код может найти подсказку? (Приложение C или bash script или что-то еще...)

4b9b3361

Ответ 1

Вы можете переключиться на альтернативный экран, используя следующую команду:

$ tput smcup

И обратно:

$ tput rmcup

Эти команды просто выводят соответствующие escape-последовательности для вашего терминала. Если это XTERM, они будут эквивалентны (более известные, но менее элегантные или портативные):

$ echo -e "\e[?1049h"

и

$ echo -e "\e[?1049l"

Для получения дополнительных команд управления терминалом см. man 5 terminfo.

Ответ 2

smcup/rmcup используются, но только для побочного эффекта: escape-последовательность, которая переключается между обычными/альтернативными экранами, обычно встроена в эти возможности terminfo - не всегда.

В фокусе xterm faq Почему экран не отображается при запуске vi?

Ответ 3

Для консольного приложения C:

Ncurses

Википедия:

ncurses (new curses) - это библиотека программирования, которая предоставляет API, который позволяет программисту писать текстовые пользовательские интерфейсы независимым от терминала образом.

less использует эту библиотеку.

Всемирная программа hello от здесь, чтобы скомпилировать ее в gcc, необходим флаг -lncurses.

#include <ncurses.h>

int main()
{   
    initscr();          /* Start curses mode          */
    printw("Hello World !!!");  /* Print Hello World          */
    refresh();          /* Print it on to the real screen */
    getch();            /* Wait for user input */
    endwin();           /* End curses mode        */

    return 0;
}