web-dev-qa-db-ja.com

画面バッファとダイアログ

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番目の画面に切り替わりますが、戻った後、そこにあるべきではない空白スペースが残ります。

enter image description here

2
g4ur4v

これは、 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のような代替画面をサポートする端末ベースの端末エミュレーターを端末内で実行します。

4

問題は提案されているよりも複雑です。スクリプトから始めます。

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つの方法のいずれかで解釈できます。

  • 無視できます
  • 代替モードから通常モードへの切り替えで実行される操作の一部が実行される場合があります。

この場合、後者:partが実行されているようです。 PuTTY(およびクイックチェックではxterm)は、プロンプトが(ではなく)画面の中央にあるため、tput smcup最初の使用からカーソル位置を復元します。上部に、clearが残ります)。スクリプトを実行する前にそのウィンドウですでにいくつかのコマンドが実行されていたため、OPはギャップに気づきました。カーソルは元の位置に戻りますが、tput rmcupの前のclearのためにコマンドはなくなりました。

1
Thomas Dickey