bash超时后如何建立默认操作的菜单?

How to build a menu with a default operation after timeout in bash?

我在 bash 中遇到了一个小问题。我想要做的是:在启动我的 raspberry pi 时自动登录并启动一个脚本,我可以在其中选择(菜单,我使用对话框)启动哪个程序。但是,当 10 秒未选择选项时,将执行默认操作(第一个选项)。

嗯,第一部分有效。但我无法包含计时器或超时。超时选项本身只是在 10 秒后终止脚本,但不会 运行 任何程序。

这是我目前所拥有的(echo 用于测试目的):

#!/bin/sh

sw=`dialog --menu "choose a program" 20 73 8 "1) program 1" "this will start program 1" "2) program 2" "this will start program 2" 3>&1 1>&2 2>&3`

case "$sw" in
   "1) program 1")
      echo "program 1 is running" ;;
   "2) program 2")
      echo "program 2 is running" ;;
esac

我知道,不多。主要是,因为我所有的尝试都走向了死胡同(据我所知——我试图用一个 sleep 命令围绕它构建 while 和 for 循环)。

不幸的是,在网上搜索没有帮助(再次:根据我的理解),所以你们有解决这个问题的想法(或解决方案)吗?我刚开始学习bash.

对话框退出时需要查看退出代码。 (这将是 $? 的值,但您需要立即获取它,因为它会在每个命令后重置。)

您可能还想自定义 return 代码,这可以通过定义一些环境变量来实现。在下面的代码片段中,我将 DIALOG_ERROR 设置为 5,这将应用于超时(和其他随机错误),同时我将 DIALOG_ESC 设置为 1,这样它与选择“取消”按钮的效果相同.默认情况下,ESC 和超时实际上 return 相同的值(255,即使联机帮助页说 -1,因为进程退出代码只有八位并且通常是无符号的)。如果您希望 Escape 键快速 select 默认值,那么您也可以将 DIALOG_ESC 设置为 5。

sw=`DIALOG_ERROR=5 DIALOG_ESC=1 dialog --timeout 10 \
           --menu "choose a program" 20 73 8 \
           "1) program 1" "this will start program 1" \
           "2) program 2" "this will start program 2" \
    3>&1 1>&2 2>&3`
rc=$?
case $rc in
   0) case "$sw" in
        "1) program 1")
            echo "program 1 is running" ;;
        "2) program 2")
            echo "program 2 is running" ;;
      esac;;
   1) echo You hit Cancel, doing nothing;;
   5) echo Running default program;;
   *) echo Unhandled exit code $rc;;;
esac

其他退出码,none适用于本例:

  • 2 次帮助按钮已按下
  • 3 按下额外的按钮
  • 4 项请求帮助

详见man dialog(搜索DIAGNOSTICS。接近尾声。)