我试图使用 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
+操作,我相信是因为初始化例程执行了该操作并希望取消该操作。所以如果你提前做了,它不会有任何效果,因为它会被取消。rmcup
ncurses
smcup
dialog
smcup
rmcup
解决方法是添加一个--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
.