屏幕缓冲区和对话框

屏幕缓冲区和对话框

我试图使用 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应该切换到第二个屏幕缓冲区,执行后应该已回到第一个屏幕缓冲区。 脚本切换到第二个屏幕,但返回后留下了不应该出现的空白区域。

在此输入图像描述

答案1

dialog这是实施的问题http://invisible-island.net/dialog/dialog.html

在启动时,它会自行执行smcup+操作,我相信是因为初始化例程执行了该操作并希望取消该操作。所以如果你提前做了,它不会有任何效果,因为它会被取消。rmcupncursessmcupdialogsmcuprmcup

解决方法是添加一个--keep-tite选项,告诉它不要这样做,因此如果终端支持的话,dialog将像其他应用程序一样执行smcup启动和rmcup退出操作。ncurses

从您的评论来看,您似乎遇到了另一个问题:您所在的终端不支持备用屏幕,因此无论您做什么,您都将无法使用该备用屏幕,因为它不存在。

不过,您可以做的是使用具有备用屏幕的其他终端,例如 Putty 或 Cygwin 的 X Server 上的 Cygwin Unix 终端。或者在远程服务器上运行 X 终端以连接到 X Server 并在其上显示。或者在终端内运行支持备用屏幕的基于终端的终端仿真器,例如 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

只有一个备用屏幕(并且您不能将其视为堆栈)。 (技术上是“启动光标寻址模式tput smcup”)通常与 xterm 和类似的程序一起使用来切换到备用屏幕。实际上,xterm 中为此目的实现了多个控制序列(请参阅为什么运行 vi 时屏幕不清除?),有些不被相似者识别。在其中一条评论中,据说 MobaXterm 是本例中的实际终端。这是基于(使用来自)PuTTY 的代码,它恰好处理 MobaXterm 的 terminfo 中的 1049 代码。

所以...

  • 脚本切换到备用屏幕
  • 它清除了(再次:xterm 清除了上一步中的备用屏幕)
  • 它运行对话框,仍然使用备用屏幕。
  • 当对话框退出时,它发送序列rmcup,切换回正常屏幕,其内容将与脚本开始之前相同
  • 然后屏幕被清除。通常这会导致光标移动到屏幕的左上角然后清除,但是(见下文)
  • 最后,tput rmcup被使用。这要求终端模拟器从备用屏幕切换回来。

由于终端已经处于正常模式,因此最后一行可以用(至少)两种方式之一解释:

  • 它可以被忽略
  • 可能会执行从备用模式切换到正常模式时执行的某些操作。

在这种情况下,似乎是后者:部分执行。PuTTY(以及快速检查 xterm)从第一的使用tput smcup,因为提示位于屏幕中间(而不是位于顶部,否则clear会留在顶部)。 OP 注意到了一个间隙,因为在运行脚本之前,该窗口中已经执行了多个命令 - 光标返回到原始位置,但clear由于tput rmcup.

相关内容