2012-06-13 4 views
19

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

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

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

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

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

ответ

29

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

$ tput smcup 

и обратно с:

$ tput rmcup 

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

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

И:

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

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

+0

Aaaah, ну хорошо. Работает как шарм. Благодаря! :) – leemes

+0

@leemes - На самом деле, перечитывая свой вопрос, вы говорите о возможности термина «ti» ... но если вы внимательно посмотрите в «man terminfo», это просто имя termcap 'smcup' !!! – rodrigo

+0

Lol? Я мог * поклясться *, что искал 'ti' (как упоминалось в вопросе) и не нашел возможности! Damn ... -.- – leemes

2

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

Ncurses

Википедия:

Ncurses (новые проклятий) является программная библиотека, которая предоставляет API, который позволяет программистам писать текстовые пользовательских интерфейсов независимым от терминала образом.

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

Всемирная программа привет от here, чтобы скомпилировать ее в 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; 
} 
+2

** Однако я не хочу использовать внешний язык сценариев (или даже что-то вроде C). ** –

4

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

Некоторые фон в XTERM ЧаВО Why doesn't the screen clear when running vi?

Смежные вопросы