私のスクリプトで別の画面バッファを使用するために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番目の画面に切り替わりますが、不可欠なスペースを残して返されます。
答え1
dialog
実践の問題だhttp://invisible-island.net/dialog/dialog.html。
smcup
起動時にそれ自体で+演算を実行しますが、初期化ルーチンが演算を実行してそれを取り消そうとするためだと思います。だから、あらかじめしておくとキャンセルになりますので何の効果もありません。rmcup
ncurses
smcup
dialog
smcup
rmcup
回避策は、これを行わないように指示するオプションを追加して、端末がサポートしている--keep-tite
場合はdialog
他のアプリケーションと同様にsmcup
起動およびrmcup
終了することです。ncurses
あなたの意見によると、別の問題に直面しているようです。あなたが使用している端末は代替画面をサポートしていないため、何をしてもその代替画面は使用できません。存在しません。
ただし、できることは、Cygwin X Server の Putty や Cygwin Unix 端末などの代替画面を持つ他の端末を使用することです。または、リモートサーバーでX端末を実行してXサーバーに接続して表示します。または、端末内でGNUなどの代替画面をサポートする端末ベースの端末エミュレータを実行してくださいscreen
。
答え2
問題は提案されたものよりも複雑です。スクリプトから始めます。
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に基づいています(コードを使用)。
だから...
- 代替画面に切り替えるスクリプト
- 消去されました(もう一度言うが、xtermは前のステップの代替画面を消去しました)。
- ダイアログボックスを起動し、まだ代替画面を使用してください。
- ダイアログボックスが終了すると、シーケンスを送信して
rmcup
通常の画面に戻り、内容はスクリプトが開始される前と同じです。 - これで画面が消去されます。通常、これによりカーソルが画面の左上に移動して消去されます(下記参照)。
- 最後に
tput rmcup
使用されます。これを行うには、ターミナルエミュレータが代替画面で再度切り替える必要があります。
端末はすでに通常モードになっているため、最後の行は(少なくとも)2つの方法のうちの1つとして解釈できます。
- それは無視することができる
- スタンバイモードから通常モードに切り替えるときに実行されるいくつかのタスクが実行されることがあります。
この場合は後者のようです。部分実装する。 PuTTY(およびxtermのクイックチェック)最初tput smcup
プロンプトが画面の中央にあるために使用されます(上部にはclear
残っていません)。 OPは、スクリプトを実行する前にウィンドウで複数のコマンドが実行されたため、スペースを見つけました。カーソルが元の位置に戻っclear
たがtput rmcup
。