2012-06-13 15 views
19

La pantalla alternativa es utilizada por muchas aplicaciones de terminal "interactivas con el usuario" como vim, htop, screen, alsamixer, less, ... Es como un buffer diferente de el contenido del terminal, que desaparece cuando la aplicación sale, por lo que se restaura todo el terminal y parece que la aplicación no ha generado nada.Uso de la "pantalla alternativa" en un script bash

Me gustaría lograr exactamente lo mismo en mi propio script de shell (bash), excepto que no tiene que ser tan portátil. Me quedaría con linux solo y emuladores de terminal basados ​​en xterm; pero la solución debería usar algo como tput si es posible. Sin embargo, no quiero usar un lenguaje de scripting externo (o algo así como C).

Aunque no quiero usar C (como debería ser un script bash con el menor número de dependencias posible), eché un vistazo al código fuente de menos. Parece utilizar terminfo como la base de datos y busca la capacidad del terminal "ti" en su inicialización. Al quitar la línea, no usa el sceen alternativo, así que asumí que encontré la línea de código responsable.

Sin embargo, no puedo encontrar tal capacidad en man terminfo. Pero tal vez estoy en el camino equivocado para encontrar una solución para esto. Quizás terminfo/tput no sea mi amigo.

Entonces, ¿cómo puedo usar la pantalla alternativa en un script bash? ¿Alguien sabe una aplicación simple en la cual el código fuente puedo encontrar una pista? (Aplicación C o escritura del golpe o lo que sea ...)

Respuesta

29

Puede cambiar a la pantalla alterna el uso de este comando:

$ tput smcup 

y la espalda con:

$ tput rmcup 

Estos comandos solo salidas de la secuencias de escape apropiadas para su terminal. Si se trata de un XTERM que será equivalente a la (más conocido, pero menos elegante o portátil):

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

Y:

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

órdenes de control más terminales ver man 5 terminfo.

+0

Aaaah, así también. Funciona de maravilla. ¡Gracias! :) – leemes

+0

@leemes - En realidad, volviendo a leer tu pregunta, hablas de la capacidad del terminal 'ti' ... pero si miras detenidamente en' man terminfo', ¡es solo el nombre de termcap de 'smcup' !!! – rodrigo

+0

¿Lol? Podría * jurar * que busqué 'ti' (como se menciona en la pregunta) y ¡no encontré la capacidad! Maldición ... -.- – leemes

2

para C aplicación de consola:

ncurses

Wikipedia:

ncurses (new curses) es una biblioteca de programación que proporciona una API que permite que el programador escriba basado en texto las interfaces de usuario de una manera independiente del terminal.

less utiliza esta biblioteca.

Un hello world program from here, para compilarlo en gcc, flag -lncurses es necesario.

#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

** Sin embargo, no quiero utilizar un lenguaje de scripting externo (o incluso algo así como C). ** –

4

smcup/rmcup se utilizan, pero sólo para el efecto secundario: la secuencia de escape que conmuta entre las pantallas normales/alterna generalmente se incrusta en esas capacidades terminfo - no siempre.

Algunos antecedentes es en el FAQ xterm Why doesn't the screen clear when running vi?

Cuestiones relacionadas