我将创建一个使用用户输入的脚本,因此我决定使用whiptail
.
但现在我有点困惑哪个是可移植的并且可以在 Ubuntu 10.x 及更高版本和 CentOS 5.x 及更高版本上运行。
我知道read
,但我想要一个像dialog
.如果有人知道任何替代方案,请告诉我。
答案1
whiptail
大多数基于 deb 的系统上默认安装,而则dialog
不然。
公平地说,基于 rpmwhiptail
也是默认的对话框应用程序。
我想这对你来说很重要。
从便携性的角度来看,这whiptail
也是正确的选择。
亦whiptail
是基于newt
,同时dialog
是基于ncurses
。从我的角度来看,第一个更漂亮(:
答案2
然后有鞭尾。出于实用目的,它由 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
从它的自述文件来看: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...."