鞭尾或对话

Rah*_*til 20 bash shell-script whiptail dialog

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

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

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

rus*_*ush 16

whiptail在大多数基于 deb 的系统上默认安装,而dialog没有安装。

Afair,基于 rpmwhiptail也是默认对话框应用程序。

我想这对你很重要。

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

也是whiptail基于newt,而dialog基于ncurses。在我看来,第一个更漂亮(:

  • *script* 可能或多或少具有可移植性,但对话程序本身的可移植性不亚于whiptail。 (2认同)
  • 写到这里了,为什么*whiptail*会比*dialog*更漂亮呢?后者具有更多功能和更好的文档。 (2认同)

小智 10

根据dialog(1) 手册页兼容性部分

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

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

whiptail 设计为 drop-in 兼容 dialog,但功能较少:一些对话框没有实现,如 tailbox、timebox、calendarbox 等。

比较实际大小(Debian 测试,2007/1/10):whiptail、newt、popt 和 slang 库的总大小为757 KB。对话 (计数 ncurses)的可比较数量 是 520 KB。无视第一段。

第二段具有误导性,因为 *whiptail** 也不适用于dialog 的常见选项,例如仪表框。 与 1990 年代中期的原始对话 0.4 程序相比,whiptail对话的兼容性较差 。

例如,whiptail的联机帮助页借用了dialog 的功能 ,例如,但奇怪的是仅引用了 0.4 (1994) 以下的对话框版本作为来源。也就是说,它的联机帮助页引用了从最近版本的dialog借来的功能,例如,

  • --gauge (从 0.5)

  • --passwordbox(来自 1999 年的 Debian 更改),

  • --default-item(来自对话框2000/02/22),

  • --output-fd(来自对话框2002/08/14)。

有点幽默的是,人们可能会注意到使用“--”作为转义符的 popt功能(在其联机帮助页中未记录)在大约一年的时候在dialog的联机帮助页中记录,而在whiptail的联机帮助页中提到它之前。 whiptail的联机帮助页错误地将其归因于getopt(无论如何都是不准确的)。


man*_*ork 9

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

正如Bash Shell Scripting/Whiptail所写:

从它的 README 来看: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
Run Code Online (Sandbox Code Playgroud)

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


小智 9

为什么不同时使用:

(需要 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...."    
Run Code Online (Sandbox Code Playgroud)

  • 这么复杂。为什么不是这样的:`whichwhiptail &amp;&amp; window=whiptail; which dialog &amp;&amp; window=dialog; [ -z window ] &amp;&amp; echo "nowhiptail or dialog"`。然后操作员可以执行` $window --title foo --msgbox bar 87 5 `。 (2认同)