如何在bash中构建超时后具有默认操作的菜单?

如何在bash中构建超时后具有默认操作的菜单?,bash,menu,dialog,timeout,Bash,Menu,Dialog,Timeout,我在bash中遇到了一个小问题。我想做的是:当启动我的raspberry pi自动登录并启动一个脚本时,我可以选择(像菜单一样,我使用对话框)启动哪个程序。但是,当10秒钟内未选择选项时,应执行默认操作(第一个选项) 好吧,第一部分起作用了。但我不能包括计时器或超时。超时选项本身只是在10秒后终止脚本,但不运行任何程序 以下是我到目前为止得到的(回音用于测试): 我知道,这并不多。主要是因为我所有的尝试都导致了一个死胡同(据我所知,我试图在while中构建循环,并在循环中使用sleep命令) 不

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

好吧,第一部分起作用了。但我不能包括计时器或超时。超时选项本身只是在10秒后终止脚本,但不运行任何程序

以下是我到目前为止得到的(回音用于测试):

我知道,这并不多。主要是因为我所有的尝试都导致了一个死胡同(据我所知,我试图在while中构建循环,并在循环中使用sleep命令)


不幸的是,搜索网页并没有帮助(再次:我的理解),所以你们有一个想法(或解决方案)如何解决这个问题?我刚开始学习bash。

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

您可能还希望自定义返回代码,这可以通过定义一些环境变量来实现。在下面的代码段中,我将
DIALOG\u ERROR
设置为5,这将应用于超时(和其他随机错误),而将
DIALOG\u ESC
设置为1,以便与选择取消按钮相同。默认情况下,ESC和timeout有效地返回相同的值(255,尽管手册页显示为-1,因为进程退出代码只有8位,并且通常是无符号的)。如果希望Escape键快速选择默认值,则可以将
DIALOG\u 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
其他退出代码,其中任何一个都不适用于本例:

  • 2按下帮助按钮
  • 按下3个额外按钮
  • 需要4项帮助
有关详细信息,请参见
man对话框
(搜索
DIAGNOSTICS
。它就在末尾。)

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