鞭尾或对话

鞭尾或对话

我将创建一个使用用户输入的脚本,因此我决定使用whiptail.

但现在我有点困惑哪个是可移植的并且可以在 Ubuntu 10.x 及更高版本和 CentOS 5.x 及更高版本上运行。

我知道read,但我想要一个像dialog.如果有人知道任何替代方案,请告诉我。

答案1

whiptail大多数基于 deb 的系统上默认安装,而则dialog不然。

公平地说,基于 rpmwhiptail也是默认的对话框应用程序。

我想这对你来说很重要。

从便携性的角度来看,这whiptail也是正确的选择。

whiptail是基于newt,同时dialog是基于ncurses。从我的角度来看,第一个更漂亮(:

答案2

根据对话框(1) 手册页的“兼容性”部分:

然后有鞭尾。出于实用目的,它由 Debian 维护(其上游开发人员完成的工作很少)。其文档(README.whiptail)声称

鞭尾(1) 是一个轻量级的替代品对话(1)、为shell脚本提供对话框。它基于 newt 窗口库而不是 ncurses 库构建,因此在安装程序、救援磁盘等嵌入式环境中体积更小。

Whittail被设计为与对话框直接兼容,但功能较少:一些对话框未实现,例如tailbox、timebox、calendarbox等。

比较实际大小(Debian 测试,2007/1/10): 的总大小鞭尾、newt、popt 和 slang 库为 757 KB。可比较的数字为 对话 (计算 ncurses)为 520 KB。请忽略第一段。

第二段具有误导性,因为 *whiptail** 也不适用于以下常见选项对话,如仪表箱。 鞭尾 不太兼容 对话 比最初的 20 世纪 90 年代中期的Dialog 0.4 程序要好。

鞭尾的联机帮助页借用了以下功能 对话,例如,但奇怪的是仅引用对话0.4 (1994) 之前的版本作为源。也就是说,它的联机帮助页引用了从更新版本的对话,例如,

  • - 测量(从 0.5)

  • --密码框(来自 1999 年 Debian 的变更),

  • --默认项目(从对话2000/02/22),

  • --输出-fd(从对话2002/08/14)。

有点幽默的是,人们可能会注意到波普特使用“--”作为转义符的功能(在其联机帮助页中未记录)记录在对话的联机帮助页大约一年前被提及鞭尾的联机帮助页。 鞭尾的手册页错误地将其归因于获取选择(无论如何都是不准确的)。

答案3

(这不一定是答案,但由于代码量,我这样发布。我没有实际经验。如果用户在此发布经过测试的解决方案,whiptail稍后将删除它。)whiptail

作为Bash Shell 脚本/Whiptail写道:

从它的自述文件来看:whiptail被设计为与dialog(1)直接兼容,但功能较少:一些对话框没有实现,例如tailbox、timebox、calendarbox等。

这意味着您不一定要决定其中之一。只需检测哪一个可用,然后让脚本使用它:

# check whether whiptail or dialog is installed
# (choosing the first command found)
read dialog <<< "$(which whiptail dialog 2> /dev/null)"

# exit if none found
[[ "$dialog" ]] || {
  echo 'neither whiptail nor dialog found' >&2
  exit 1
}

# just use whichever was found
"$dialog" --msgbox "Message displayed with $dialog" 0 0

(是的,对于安装在名称包含换行符的目录中的工具,上述检测将失败。我只是保持简单。)

答案4

为什么不同时使用两者:

(需要 bash 4)

#!/usr/bin/env bash
t(){ type "$1"&>/dev/null;}
function Menu.Show {
   local DIA DIA_ESC; while :; do
      t whiptail && DIA=whiptail && break
      t dialog && DIA=dialog && DIA_ESC=-- && break
      exec date +s"No dialog program found"
   done; declare -A o="$1"; shift
   $DIA --backtitle "${o[backtitle]}" --title "${o[title]}" \
      --menu "${o[question]}" 0 0 0 $DIA_ESC "$@"; }



Menu.Show '([backtitle]="Backtitle"
            [title]="Title"
            [question]="Please choose:")'          \
                                                   \
            "Option A"  "Stuff...."                \
            "Option B"  "Stuff...."                \
            "Option C"  "Stuff...."    

相关内容