当通过命令替换表达式启动时,为什么“dialog”不显示菜单(但接受接受)?

当通过命令替换表达式启动时,为什么“dialog”不显示菜单(但接受接受)?

我想通过 bash shell 脚本向用户提供一个可供选择的菜单。然后应将选择存储在环境变量中以供以后进一步使用。

如果我从命令行运行:

dialog \
    --backtitle "Make a choice" \
    --menu "Take a pick" \
    10 40 3 \
    choice1 "First choice" \
    choice2 "Second choice"

然后一切正常;我得到了我想要的菜单,choice1或者choice2打印回来给我。但是,如果我运行:

SELECTION=$( dialog \
    --backtitle "Make a choice" \
    --menu "Take a pick" \
    10 40 3 \
    choice1 "First choice" \
    choice2 "Second choice" \
)

那么它就不再按照我想要的方式工作了。

  • 没有显示菜单,但(据我所知)dialog当我按 Enter 时退出
  • 当我按 Enter 退出非显示菜单时,选择的标签出现在终端上,而不是存储到 $SELECTION 中

我尝试添加2>&1将 stderr 重定向到 stdout,以防它确实被打印到 stderr。唯一明显的影响是现在,没有什么从命令替换表达式返回或者打印到终端。

在我的系统上,dialogcdialog1.1-20120215。手册dialog页提到了--menu这一点退出时,所选菜单项的标签将打印在对话框的输出上。这似乎应该与上面类似的东西一起工作,但它不适合我。

我想要显示的菜单,允许用户在可用选项之间进行选择,当用户接受时,所选选项的标签(例如choice2)将存储在环境变量 $SELECTION 中。如果用户取消,应该有明确的指示(理想情况下,$SELECTION 将是未定义的或零长度字符串)。

我怎样才能做到这一点?我缺少哪一块拼图?

建议替代方案的解决方案dialog也是可以接受的,只要它们提供了一个不错的菜单可供选择,并且理想情况下建议的软件不是太奇特(main要求 Debian Stable 存储库中的可用性)。

答案1

尝试使用以下--stdout选项:

$ SELECTION=$( dialog --stdout \
    --backtitle "Make a choice" \
    --menu "Take a pick" \
    10 40 3 \
    choice1 "First choice" \
    choice2 "Second choice" \
)

相关内容