Tputを使用して、スクリプトに別の画面バッファーを使用しようとしていました。以下は私が実行している小さなスクリプトです。
tput smcup
clear
dialog --yesno "Do you want to continue?" 0 0
rc=$?
clear
tput rmcup
if [ "${rc}" == "0" ]; then
echo Yes
else
echo No
fi
スクリプトの実行が終了すると、画面に空白の部分が表示されます(下の画像を参照)。これは、スクリプトを実行する前にプロンプトが占めていた行と同じです。理想的には、tput
は2番目の画面に切り替える必要があります。バッファと実行後、最初の画面バッファに戻るはずです。 スクリプトは2番目の画面に切り替わりますが、戻った後、そこにあるべきではない空白スペースが残ります。
これは、 http://invisible-island.net/dialog/dialog.html からのdialog
実装の問題です。
起動時に、それはそれ自体でsmcup
+ rmcup
を実行します。ncurses
初期化ルーチンはsmcup
を実行し、dialog
はそれをキャンセルします。したがって、事前にsmcup
を実行すると、rmcup
がキャンセルするため、効果はありません。
回避策は、それを行わないように指示する--keep-tite
オプションを追加することです。したがって、dialog
は開始時にsmcup
を実行し、終了時にrmcup
を実行します。 ncurses
アプリケーション(端末がサポートしている場合)。
あなたのコメントから、あなたは別の問題を抱えているようです:あなたは代替画面をサポートしていない端末にいるので、あなたが何をしても、それが存在しないのでその代替画面を使うことができません。
ただし、PuTTYのような代替画面を備えた別の端末を使用するか、CygwinのXサーバー上のCygwinのUnix端末を使用することができます。または、リモートサーバーでXターミナルを実行して、Xサーバーに接続して表示します。または、GNU screen
のような代替画面をサポートする端末ベースの端末エミュレーターを端末内で実行します。
問題は提案されているよりも複雑です。スクリプトから始めます。
tput smcup
clear
dialog --yesno "Do you want to continue?" 0 0
rc=$?
clear
tput rmcup
if [ "${rc}" == "0" ]; then
echo Yes
else
echo No
fi
代替画面は1つだけです(スタックのように扱うことはできません)。 tput smcup
(技術的には「カーソルアドレッシングモードの開始」)は、代替画面に切り替えるためにxtermやそっくりさんでよく使用されます。この目的のためにxtermに実装されている制御シーケンスは実際には複数あります(viを実行すると画面がクリアされないのはなぜですか?を参照)、およびいくつかそっくりさんには認識されません。コメントの1つでは、この場合、MobaXtermが実際の端末であると言われています。これは、MobaXtermのterminfoでたまたま1049コードを処理するPuTTYに基づいています(からのコードを使用します)。
そう...
rmcup
シーケンスが送信され、通常の画面に戻ります。その内容は、スクリプトが開始される前と同じになります。tput rmcup
が使用されます。これにより、ターミナルエミュレータは代替画面から戻るように求められます。端末はすでに通常モードになっているため、その最後の行は(少なくとも)2つの方法のいずれかで解釈できます。
この場合、後者:partが実行されているようです。 PuTTY(およびクイックチェックではxterm)は、プロンプトが(ではなく)画面の中央にあるため、tput smcup
の最初の使用からカーソル位置を復元します。上部に、clear
が残ります)。スクリプトを実行する前にそのウィンドウですでにいくつかのコマンドが実行されていたため、OPはギャップに気づきました。カーソルは元の位置に戻りますが、tput rmcup
の前のclear
のためにコマンドはなくなりました。