bash 实用程序“对话框”导致屏幕混乱

bash 实用程序“对话框”导致屏幕混乱

当我运行此脚本时,它会在我的终端上以菜单样式显示选项,然后在脚本中运行相关命令。

脚本屏幕

#!/bin/sh
TEMP=/tmp/answer$$
dialog --ascii-lines --title "Administrative tasks"  --menu  "Tasks :" 20 0 0 1 "Display firewall settings" 2 "Restore firewall settings" 3 "Flush Firewall settings" 2>$TEMP
choice=`cat $TEMP`
case $choice in
        1)      iptables -L
                ;;
        2)      iptables-restore </etc/iptables.firewall.rules
                iptables -L
                ;;
        3)      iptables --flush
                iptables -L
                ;;
esac
echo Selected $choice

但当它退出时屏幕就乱了。

有没有办法在我运行此程序之前“保存”屏幕状态并恢复它?

是否有更好的在文本屏幕中运行的“Windows”脚本程序?

屏幕乱了

答案1

我知道已经很晚了,但也许你想换到备用屏幕(例如nano,,vim以及其他人也这样做),所以您可以尝试该--keep-tite选项。

来自对话的手册页:

--keep-tite:通常 dialog 会检查它是否在 xterm 中运行,如果是,则会尝试隐藏使其切换到备用屏幕的初始化字符串。在多次运行 dialog 的脚本中,在正常屏幕和备用屏幕之间切换会造成视觉干扰。使用此选项可允许 dialog 使用这些初始化字符串。

以下是一个例子:

echo "Write something before invoking dialog."
dialog --keep-tite --msgbox "Hello world!" 0 0

用户点击“确定”后,dialog ...将恢复调用之前打印的输出。

答案2

dialog手册页提及whiptail(以一种相当贬低的方式)。它没有选项--ascii-lines,但它也不会弄乱屏幕:

带有对话和鞭尾效果的终端屏幕截图

剧本:

#!/bin/sh
TEMP=/tmp/answer$$
whiptail --title "Administrative tasks"  --menu  "Tasks :" 20 0 0 1 "Display firewall settings" 2 "Restore firewall settings" 3 "Flush Firewall settings" 2>$TEMP
choice=`cat $TEMP`
case $choice in
        1)      echo 1 #iptables -L
                ;;
        2)      echo 2 #iptables-restore </etc/iptables.firewall.rules
                #iptables -L
                ;;
        3)      echo 3 #iptables --flush
                #iptables -L
                ;;
esac
echo Selected $choice

显示来自whiptail鞭尾动作的屏幕截图

除其他事项外,whiptail基于newt而不是ncurses。它也是 的依赖项ubuntu-minimal,因此它应该默认安装在所有 Ubuntu 系统上(至少从 14.04 开始)。

答案3

clear只需在该行后添加dialog

...
dialog --ascii-lines --title "Administrative tasks"  --menu  "Tasks :" 20 0 0 1 "Display firewall settings" 2 "Restore firewall settings" 3 "Flush Firewall settings" 2>$TEMP
clear #clears the terminal screen
choice=`cat $TEMP`
case $choice in
...

答案4

使用 screen 命令可以实现这一点。

使用下面的屏幕运行它,

screen bash yourcommand.sh

这将显示对话框屏幕然后收集选择。此外,这将在退出时恢复现有屏幕。

相关内容