web-dev-qa-db-ja.com

bashスクリプトで「代替画面」を使用する

代替画面は、vim、htop、screen、alsamixer、lessなどの多くの「ユーザーインタラクティブ」端末アプリケーションで使用されます。これは、端末コンテンツの別のバッファーのようなもので、アプリケーションが終了するため、端末全体が復元され、アプリケーションが何も出力していないように見えます。

自分のシェル(bash)スクリプトでまったく同じことを実現したいのですが、移植性がそれほど高くなくてもかまいません。私はLinuxのみとxtermベースのターミナルエミュレーターに固執します。ただし、可能であれば、ソリューションではtputのようなものを使用する必要があります。ただし、外部のスクリプト言語(またはCのようなもの)は使いたくありません。

私はCを使いたくありませんが(依存関係ができるだけ少ないbashスクリプトである必要があるため)、より少ないソースコードを調べました。データベースとしてterminfoを使用しているようで、初期化時に「ti」端末機能を検索します。行を削除するとき、それは代替画面を使用しないので、私は責任のあるコード行を見つけたと思いました。

しかし、私はman terminfoでそのような機能を見つけることができません。しかし、おそらく私はこれに対する解決策を見つけるために間違った道を進んでいます。多分terminfo/tputは私の友達ではありません。

では(どのように)bashスクリプトで代替画面を使用できますか?誰かが私がヒントを見つけるかもしれないソースコードの簡単なアプリケーションを知っていますか? (Cアプリケーションまたはbashスクリプトなど...)

39
leemes

次のコマンドを使用して、別の画面に切り替えることができます。

$ tput smcup

そして戻って:

$ tput rmcup

これらのコマンドは、端末に適切なエスケープシーケンスを出力するだけです。 XTERMの場合、それらは(より知られているが、あまりエレガントではなく、移植性が低い)と同等になります。

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

そして:

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

その他の端末制御コマンドについては、man 5 terminfoを参照してください。

58
rodrigo

smcup/rmcupが使用されますが、副作用のためだけです。通常の画面と代替画面を切り替えるエスケープシーケンスは、通常、これらのterminfo機能に組み込まれています。常にではありません。

Xtermのよくある質問にいくつかの背景があります viを実行すると画面がクリアされないのはなぜですか?

6
Thomas Dickey

Cコンソールアプリケーションの場合:

ncurses

ウィキペディア:

ncurses(新しいcurses)は、プログラマーが端末に依存しない方法でテキストベースのユーザーインターフェイスを記述できるようにするAPIを提供するプログラミングライブラリです。

lessはこのライブラリを使用します。

here のhello worldプログラムを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;
}
4
golopot